home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 June / SIMTEL_0692.cdr / msdos / turbopas / pull15.arc / PULLDEMO.PAS < prev    next >
Pascal/Delphi Source File  |  1987-08-31  |  37KB  |  897 lines

  1. { PullDemo.pas - full-featured demo for PULL15.INC          ver 1.5, 08-31-87 }
  2.  
  3. { *****************************    STEP 1   ********************************* }
  4. {$C-}   { Be sure to set this in your final program.  A special case of
  5.           fast keyboard repeat programs will produce errors when the buffer
  6.           is full and $C+. }
  7.  
  8. { Place data storage limits on include files.  When you first start a program,
  9.   give yourself some breathing room and make the constants large.  In your
  10.   final version, you can trim them down. }
  11. {$I qwik30.inc }
  12.  
  13. const
  14.   MaxWndw = 15;              { Max Number of Windows on display at one time. }
  15. {$I window34.inc }
  16.  
  17. const
  18.   MaxMenuLines     = 15;     { For Main and Sub menus }
  19.   MaxCharsPerLine  = 20;     { For Main and Sub menus and Data Windows }
  20.   MaxStringLength  = 80;     { Screen limit }
  21.   LastMainMenu     =  8;     { 1 - 255 }
  22.   NumOfMainMenus   =  8;     { 1 - 255 }
  23.   NumOfSubMenus    =  5;     { 1 - 255 }
  24.   NumOfDataWndws   =  9;     { 1 - 255 }
  25.   NumOfHelpWndws   = 13;     { 1 - 255 }
  26.   NumOfMsgLines    =  9;     { 1 - 255 }
  27.   NumOfErrMsgLines =  6;     { 1 - 32767 }
  28.   MaxErrStrLength  = 60;     { Error messages are usually shorter }
  29.   TotalHelpLines   = 68;     { 2 - Screen limit }
  30.   HelpCharsPerLine = 50;     { 1 - Screen limit }
  31. {$I pull15.inc }
  32. {$I pullde15.inc }    { or use pullde__.inc to delete data entry package }
  33. {$I pulluser.inc }    { for special windows or menus }
  34.  
  35. { *****************************    STEP 2   ********************************* }
  36.  
  37. { ------------------ Set up your window names here in order: ---------------- }
  38. { This is optional, but it sure helps you in not only understanding the
  39.   program, but also makes it unquestionably easier to rearrange.              }
  40.  
  41. type
  42.   MainMenuNames = (NoMainMenu,FilesMenu,ColorMenu,AutoPartsMenu,EnterDataMenu,
  43.                    OptionsMenu,UtilitiesMenu,IRSmenu,QuitMenu);
  44.   SubMenuNames  = (NoSubMenu,TiresMenu,RadioMenu,UpdateMenu,DateMenu,
  45.                    BrandsMenu);
  46.   DataWndwNames = (NoDW,BytesDW,IntegersDW,RealsDW,HexDW,CharsDW,StringsDW,
  47.                    FileNameDW,DateDW,YearDW);
  48.   HelpWndwNames = (NoHW,WorkWndwHW,TopMenuHW,FilesMenuHW,BrandsMenuHW,
  49.                    EnterDataMenuHW,IRSmenuHW,DateMenuHW,UpdateMenuHW,
  50.                    ExecChoiceHW,SingleChoiceHW,MultipleChoiceHW,
  51.                    NumericHW,TextHW);
  52.   HelpLineNames = (NoHL,               { HL - HelpLine;  L  - Last }
  53.                    HLw1,HLw2,HLw3,HLw4,HLw5,HLw6,  { Work window }
  54.                    HLw7,HLw8,HLw9,HLw10,HLwL,
  55.                    HLt1,HLtL,                 { Top menu }
  56.                    HLb1,HLb2,HLb3,HLb4,HLb5,  { Brands submenu }
  57.                    HLb6,HLb7,HLbL,
  58.                    HLf1,HLf2,HLf3,HLf4,HLf5,  { Files submenu }
  59.                    HLf6,HLf7,HLf8,HLf9,HLfL,
  60.                    HLe1,HLe2,HLe3,HLe4,HLe5,  { Enter data submenu }
  61.                    HLe6,HLe7,HLe8,HLe9,
  62.                    HLe10,HLe11,HLe12,HLeL,
  63.                    HLi1,HLi2,HLiL,            { IRS menu }
  64.                    HLd1,HLd2,HLd3,HLdL,       { Date submenu }
  65.                    HLu1,HLu2,HLuL,            { Update submenu }
  66.                    HLx1,HLx2,HLxL,            { eXecute choice menu }
  67.                    HLs1,HLs2,HLsL,            { Single choice menu }
  68.                    HLm1,HLm2,HLmL,            { Multiple choice menu }
  69.                    HLn1,HLn2,HLnL,            { Numeric data entry window }
  70.                    HLtx1,HLtxL);              { Text data entry window }
  71. { Careful! - Always test your last main menu, submenu, data window, and help
  72.   window for run-time error!  It makes sure you have allotted enough memory
  73.   with your constants.  The compiler cannot check it with these typed scalars.)
  74.  
  75. { ----------------------- User information starts here: --------------------- }
  76. procedure GetUserPullStats;
  77. begin
  78.   LocationWarning:=true;   { If true and a Submenu won't fit, a message is
  79.                              displayed.  If false, you can override the
  80.                              location without the message. }
  81.   case ActiveDD of         { I'll put this in QWIK next time. }
  82.     EgaColor..VgaColor: CRTrows:=succ(EgaRows);
  83.   else CRTrows:=25;
  84.   end;
  85.  
  86.   { This is all the configuration data.  The program first clears all
  87.     RECORD values to $00.  The values below will set new values.  Therefore,
  88.     setting RECORD values to "false" or the like is not necessary. }
  89.  
  90.   { ------------------ Set up your colors and borders here: ---------------- }
  91.   TopMenuAttr:=  Attr(black,lightgray); TopMenuHattr:= Attr(white,black);
  92.  
  93.   MainMenuBattr:=Attr(lightgray,black);
  94.   MainMenuHattr:=Attr(black,lightgray); MainMenuLattr:=Attr(yellow,black);
  95.   MainMenuCattr:=Attr(lightgray,black);
  96.  
  97.   SubMenuWattr:= Attr(black,cyan);      SubMenuBattr:= Attr(black,cyan);
  98.  
  99.   if Vmode=7 then
  100.     begin
  101.       TopMenuLattr :=TopMenuAttr;
  102.       MainMenuWattr:=Attr(lightgray,black    );
  103.       SubMenuHattr :=Attr(black    ,lightgray);
  104.       SubMenuLattr :=Attr(white    ,black    );  { :=white;     }
  105.       SubMenuCattr :=Attr(lightgray,black    );  { :=lightgray; }
  106.     end
  107.   else
  108.     begin
  109.       TopMenuLattr :=Attr(red      ,lightgray);
  110.       MainMenuWattr:=Attr(white    ,black    );
  111.       SubMenuHattr :=Attr(white    ,blue     );
  112.       SubMenuLattr :=Attr(white    ,cyan     );
  113.       SubMenuCattr :=Attr(blue     ,cyan     );
  114.     end;
  115.  
  116.   DataWndwWattr:=Attr(black,brown);     DataWndwBattr:=Attr(black,brown);
  117.   HelpWndwWattr:=Attr(black,green);     HelpWndwBattr:=Attr(black,lightgray);
  118.   MsgLineAttr  :=Attr(green,black);
  119.  
  120.   Brdr[UserBrdr]:=Brdr[MixedBrdr];   { Give Main menus a custom border. }
  121.   with Brdr[UserBrdr] do
  122.     begin
  123.       BL:=Brdr[SingleBrdr].BL;
  124.       BH:=Brdr[SingleBrdr].BH;
  125.       BR:=Brdr[SingleBrdr].BR
  126.     end;
  127.   MainMenuBrdr:=UserBrdr;               SubMenuBrdr :=SingleBrdr;
  128.   DataWndwBrdr:=MixedBrdr;              HelpWndwBrdr:=MixedBrdr;
  129.   HelpZoom:=true;                       HelpShadow:=Right;
  130.   RowsBelowHelp:=4;                     RowsBelowMsg:=0;
  131.  
  132.   { ------------------------- Top Menu defaults ----------------------------- }
  133.   TopMenuRow:=2;        { Top menu to appear on row 2 }
  134.   MPulled:=3;           { Main menu title to be HiLited when F10 is pressed. }
  135.   MoreCmdSeq:='ATB';    { Sequence of command letter(s) as if keyed in.  This }
  136.                         { will be the default menu(s) pulled. }
  137.   Pull:=false;          { Set this true if you want the command sequence}
  138.                         {  to pull down the menus at startup. }
  139.  
  140.   { ------------------- Set up your MainMenu records here: ------------------ }
  141.   MainMenuRow:=3;       { First row of Main menus to appear on screen row 3 }
  142.   with MainMenu[ord(FilesMenu)] do
  143.   begin
  144.     MenuMode:=ExecSingleChoice; SingleFlagLine:=5;
  145.     Title:='Files';
  146.     Line[1]:='Get';             LineMode[1]:=ToDataWndw;
  147.                                 LinkNum [1]:=ord(FileNameDW);
  148.     Line[2]:='Save';            LineMode[2]:=ExecOnly;
  149.     Line[3]:='save As';         LineMode[3]:=ToDataWndw;
  150.                                 LinkNum [3]:=ord(FileNameDW);
  151.     Line[4]:='────────────';    LineMode[4]:=Comment;
  152.     Line[5]:='Merge';
  153.     Line[6]:='make Backup';
  154.     Line[7]:='text Out';
  155.     Line[8]:='';                LineMode[8]:=Partition;   LinkNum[8]:=11;
  156.     Line[9]:='Help comment';    LineMode[9]:=Comment;     LinkNum[9]:=11;
  157.     MenuLines:=9;               DefaultLine:=6;
  158.     MsgLineNum:=3;              HelpWndwNum:=ord(FilesMenuHW);
  159.   end;
  160.   with MainMenu[ord(ColorMenu)] do
  161.   begin
  162.     MenuMode:=SingleChoice;     SingleFlagLine:=2;
  163.     Title:='Color';
  164.     Line[1]:='Blue';
  165.     Line[2]:='Green';
  166.     Line[3]:='Orange';
  167.     Line[4]:='Yellow';
  168.     Line[5]:='Red';
  169.     Line[6]:='Cyan';
  170.     Line[7]:='Ultraviolet';
  171.     MenuLines:=7;               DefaultLine:=5;
  172.     MsgLineNum:=3;              HelpWndwNum:=ord(SingleChoiceHW);
  173.   end;
  174.   with MainMenu[ord(AutoPartsMenu)] do
  175.   begin
  176.     MenuMode:=MultipleChoice;
  177.     Title:='AutoParts';
  178.     Line[1]:='Tires';           LineMode[1]:=ToSubMenu;
  179.                                 LinkNum [1]:=ord(TiresMenu);
  180.     Line[2]:='Radio';           LineMode[2]:=ToSubMenu;
  181.                                 LinkNum [2]:=ord(RadioMenu);
  182.     Line[3]:='Seats';           LineMode[3]:=ToDataWndw;
  183.                                 LinkNum [3]:=ord(BytesDW);
  184.     Line[4]:='Mirrors';         Flagged[4]:=true;
  185.     Line[5]:='Locks';
  186.     Line[6]:='HiBeams';         Flagged[6]:=true;
  187.     Line[7]:='Wheels';
  188.     MenuLines:=7;               DefaultLine:=1;
  189.     MsgLineNum:=3;              HelpWndwNum:=ord(MultipleChoiceHW);
  190.   end;
  191.   with MainMenu[ord(EnterDataMenu)] do
  192.   begin
  193.     MenuMode:=MultipleChoice;
  194.     Title:='EnterData';
  195.     Line[1]:='Byte';            LineMode[1]:=ToDataWndw;
  196.                                 LinkNum [1]:=ord(BytesDW);
  197.     Line[2]:='Integer';         LineMode[2]:=ToDataWndw;
  198.                                 LinkNum [2]:=ord(IntegersDW);
  199.     Line[3]:='Real';            LineMode[3]:=ToDataWndw;
  200.                                 LinkNum [3]:=ord(RealsDW);
  201.     Line[4]:='Hex';             LineMode[4]:=ToDataWndw;
  202.                                 LinkNum [4]:=ord(HexDW);
  203.     Line[5]:='Character';       LineMode[5]:=ToDataWndw;
  204.                                 LinkNum [5]:=ord(CharsDW);
  205.     Line[6]:='String';          LineMode[6]:=ToDataWndw;
  206.                                 LinkNum [6]:=ord(StringsDW);
  207.     MenuLines:=6;               DefaultLine:=2;
  208.     MsgLineNum:=3;              HelpWndwNum:=ord(EnterDataMenuHW);
  209.   end;
  210.   with MainMenu[ord(OptionsMenu)] do
  211.   begin
  212.     MenuMode:=MultipleChoice;
  213.     Title:='Options';
  214.     Line[1]:='Dual drive';
  215.     Line[2]:='Hard disk';       Flagged[2]:=true;
  216.     Line[3]:='Extended Mem';
  217.     Line[4]:='CGA';             Flagged[4]:=true;
  218.     Line[5]:='MDA';
  219.     Line[6]:='KeyBoard';
  220.     Line[7]:='Price limit';     LineMode[7]:=ToDataWndw;
  221.                                 LinkNum [7]:=ord(IntegersDW);
  222.     MenuLines:=7;               DefaultLine:=1;
  223.     MsgLineNum:=3;              HelpWndwNum:=ord(MultipleChoiceHW);
  224.   end;
  225.   with MainMenu[ord(UtilitiesMenu)] do
  226.   begin
  227.   { MenuMode:=ExecChoice; }     { This is the default }
  228.     Title:='Utilities';
  229.     Line[1]:='Copy   files';
  230.     Line[2]:='Delete files';
  231.     Line[3]:='List   file';
  232.     Line[4]:='Edit   file';
  233.     Line[5]:='Find   file';
  234.     Line[6]:='Rename file';
  235.     Line[7]:='Sort   files';
  236.     MenuLines:=7;               DefaultLine:=2;
  237.     MsgLineNum:=3;              HelpWndwNum:=ord(ExecChoiceHW);
  238.   end;
  239.   with MainMenu[ord(IRSmenu)] do
  240.   begin
  241.   { MenuMode:=ExecChoice; }     { This is the default }
  242.     Title:='IRSaccounting';
  243.     Line[1]:='Date';            LineMode[1]:=ToSubMenu;
  244.                                 LinkNum [1]:=ord(DateMenu);
  245.     Line[2]:='Cost';
  246.     Line[3]:='Revenue';
  247.     Line[4]:='Taxes';
  248.     Line[5]:='Insurance';
  249.     Line[6]:='Update';          LineMode[6]:=ToSubMenu;
  250.                                 LinkNum [6]:=ord(UpdateMenu);
  251.     Line[7]:='Years';           LineMode[7]:=ToDataWndw;
  252.                                 LinkNum [7]:=ord(BytesDW);
  253.     MenuLines:=7;               DefaultLine:=1;
  254.     MsgLineNum:=3;              HelpWndwNum:=ord(IRSmenuHW);
  255.   end;
  256.   with MainMenu[ord(QuitMenu)] do
  257.   begin
  258.   { MenuMode:=ExecChoice; }     { This is the default }
  259.     Title:='Quit';
  260.     Line[1]:='Stay';
  261.     Line[2]:='Quit';
  262.     MenuLines:=2;               DefaultLine:=1;  BackToDefault:=true;
  263.     MsgLineNum:=3;              HelpWndwNum:=ord(ExecChoiceHW);
  264.   end;
  265.  
  266.   { ----------------------- Set up your SubMenus here: --------------------- }
  267.   { Careful! -- indexes to SubMenus must be numbered in order of level; i.e.,
  268.     ALL SubMenus first, ALL SubSubMenus second, ALL SubSubSubMenus, ... etc. }
  269.   with SubMenu[ord(TiresMenu)] do
  270.     begin
  271.       MenuMode:=SingleChoice;     SingleFlagLine:=5;
  272.       Line[1]:='Brands';          LineMode[1]:=ToSubMenu;
  273.                                   LinkNum[1] :=ord(BrandsMenu);
  274.       Line[2]:='Radials';
  275.       Line[3]:='Knobbies';
  276.       Line[4]:='Track';
  277.       Line[5]:='Snow';
  278.       Line[6]:='All-Weather';
  279.       Line[7]:='4-ply';
  280.       MenuLines:=7;               DefaultLine:=1;
  281.       MsgLineNum:=4;              HelpWndwNum:=ord(SingleChoiceHW);
  282.     end;
  283.   with SubMenu[ord(RadioMenu)] do
  284.     begin
  285.       MenuMode:=MultipleChoice;
  286.       Line[1]:='FM Stereo';       Flagged[1]:=true;
  287.       Line[2]:='AM Radio';        Flagged[2]:=true;
  288.       Line[3]:='Cassette';
  289.       Line[4]:='Compact Disc';
  290.       MenuLines:=4;               DefaultLine:=4;
  291.       MsgLineNum:=4;              HelpWndwNum:=ord(MultipleChoiceHW);
  292.     end;
  293.   with SubMenu[ord(DateMenu)] do
  294.     begin
  295.     { MenuMode:=ExecChoice; }     { This is the default }
  296.       Line[1]:='Month';           LineMode[1]:=ToDataWndw;
  297.                                   LinkNum [1]:=ord(DateDW);
  298.       Line[2]:='Day';             LineMode[2]:=ToDataWndw;
  299.                                   LinkNum [2]:=ord(DateDW);
  300.       Line[3]:='Year';            LineMode[3]:=ToDataWndw;
  301.                                   LinkNum [3]:=ord(YearDW);
  302.       MenuLines:=3;               DefaultLine:=1;  BackToDefault:=true;
  303.       MsgLineNum:=4;              HelpWndwNum:=ord(DateMenuHW);
  304.     end;
  305.   with SubMenu[ord(UpdateMenu)] do
  306.     begin
  307.     { MenuMode:=ExecChoice; }     { This is the default }
  308.       Line[1]:='1 process';
  309.       Line[2]:='2 process and pop';
  310.       Line[3]:='3 pop and process';
  311.       Line[4]:='4 pop, process, pull';
  312.       Line[5]:='5 pop, pull to Years';
  313.       Line[6]:='6 pop, pull Radio';
  314.       MenuLines:=6;               DefaultLine:=4;
  315.       MsgLineNum:=4;              HelpWndwNum:=ord(UpdateMenuHW);
  316.     end;
  317.   { Here's a SubSubMenu: }
  318.   with SubMenu[ord(BrandsMenu)] do
  319.     begin
  320.       MenuMode:=SingleChoice;     SingleFlagLine:=2;
  321.       Line[1]:='Michelin';
  322.       Line[2]:='General';
  323.       Line[3]:='Firestone';
  324.       Line[4]:='Bridgestone';
  325.       Line[5]:='WeatherGuard';
  326.       MenuLines:=5;               DefaultLine:=3;
  327.       MsgLineNum:=4;              HelpWndwNum:=ord(BrandsMenuHW);
  328.     end;
  329.  
  330.   { ----------------- Set up your Data Windows here: --------------------- }
  331.   { Justification will default with numbers right justified and string to  }
  332.   { the left if none is specified.                                         }
  333.   AutoNumLock:=true;          { Turns NumLock on with numeric window }
  334.   NumLockCol:=42;             { Column to write 'NUMLOCK' on message line. }
  335.   with DataWndw[ord(BytesDW)] do
  336.     begin
  337.       Line[1]:='Currently:';
  338.       Line[2]:='Enter byte:';
  339.     { TypeOfData:=Bytes; }        { This is the default }
  340.       Field:=3;
  341.     { Justify:=Right; }           { This is the default }
  342.       MsgLineNum:=5;              HelpWndwNum:=ord(NumericHW);
  343.     end;
  344.   with DataWndw[ord(IntegersDW)] do
  345.     begin
  346.       Line[1]:='Currently:';
  347.       Line[2]:='Enter integer:';
  348.       TypeOfData:=Integers;
  349.       Field:=6;
  350.       MsgLineNum:=5;              HelpWndwNum:=ord(NumericHW);
  351.     end;
  352.   with DataWndw[ord(RealsDW)] do
  353.     begin
  354.       Line[1]:='Currently:';
  355.       Line[2]:='Enter real:';
  356.       TypeOfData:=Reals;
  357.       Field:=17;
  358.       Decimals:=08;              { Neg value uses R:F.  Pos value - R:F:D. }
  359.       MsgLineNum:=5;              HelpWndwNum:=ord(NumericHW);
  360.     end;
  361.   with DataWndw[ord(CharsDW)] do
  362.     begin
  363.       Line[1]:='Currently:';
  364.       Line[2]:='Enter char:';
  365.       TypeOfData:=Chars;
  366.       Field:=1;
  367.       MsgLineNum:=6;              HelpWndwNum:=ord(TextHW);
  368.     end;
  369.   with DataWndw[ord(HexDW)] do
  370.     begin
  371.       Line[1]:='Currently:';
  372.       Line[2]:='Enter hex:';
  373.       TypeOfData:=UserNums;
  374.       Field:=4;
  375.       MsgLineNum:=6;              HelpWndwNum:=ord(NumericHW);
  376.     end;
  377.   with DataWndw[ord(StringsDW)] do
  378.     begin
  379.       Line[1]:='Currently:';
  380.       Line[2]:='Enter string:';
  381.       TypeOfData:=Strings;
  382.       Field:=25;                 { If field is too large to fit, program
  383.                                    centers it on screen. You can override. }
  384.       MsgLineNum:=6;              HelpWndwNum:=ord(TextHW);
  385.     end;
  386.   with DataWndw[ord(FileNameDW)] do
  387.     begin
  388.       Line[1]:='Currently:';
  389.       Line[2]:='Enter name:';
  390.       TypeOfData:=Strings;
  391.       Field:=12;
  392.       MsgLineNum:=6;              HelpWndwNum:=ord(TextHW);
  393.     end;
  394.   with DataWndw[ord(DateDW)] do
  395.     begin
  396.       Line[1]:='Now:';
  397.       Line[2]:='New:';
  398.     { TypeOfData:=Bytes; }        { This is the default. }
  399.       Field:=2;
  400.       MsgLineNum:=5;              HelpWndwNum:=ord(NumericHW);
  401.     end;
  402.   with DataWndw[ord(YearDW)] do
  403.     begin
  404.       Line[1]:='Now:';
  405.       Line[2]:='New:';
  406.       TypeOfData:=Integers;
  407.       Field:=4;
  408.       MsgLineNum:=5;              HelpWndwNum:=ord(NumericHW);
  409.   end;
  410.  
  411.   { ----------------------- Set up your Help Windows here: ------------------ }
  412.   { HelpWndw[1] is reserved for the Work window. }
  413.   { HelpWndw[2] is reserved for the top menu. }
  414.  
  415.   HelpMsgLineNum:=7;                { Standard message for a Help window }
  416.  
  417.   { For 2 assignments to a record, save code by no using WITH }
  418.   HelpWndw [ord(WorkWndwHW)      ].FirstLine := ord(HLw1);
  419.   HelpWndw [ord(WorkWndwHW)      ].LastLine  := ord(HLwL);
  420.  
  421.   HelpWndw [ord(TopMenuHW)       ].FirstLine := ord(HLt1);
  422.   HelpWndw [ord(TopMenuHW)       ].LastLine  := ord(HLtL);
  423.  
  424.   HelpWndw [ord(FilesMenuHW)     ].FirstLine := ord(HLf1);
  425.   HelpWndw [ord(FilesMenuHW)     ].LastLine  := ord(HLfL);
  426.  
  427.   HelpWndw [ord(EnterDataMenuHW) ].FirstLine := ord(HLe1);
  428.   HelpWndw [ord(EnterDataMenuHW) ].LastLine  := ord(HLeL);
  429.  
  430.   HelpWndw [ord(BrandsMenuHW)    ].FirstLine := ord(HLb1);
  431.   HelpWndw [ord(BrandsMenuHW)    ].LastLine  := ord(HLbL);
  432.  
  433.   HelpWndw [ord(IRSmenuHW)       ].FirstLine := ord(HLi1);
  434.   HelpWndw [ord(IRSmenuHW)       ].LastLine  := ord(HLiL);
  435.  
  436.   HelpWndw [ord(DateMenuHW)      ].FirstLine := ord(HLd1);
  437.   HelpWndw [ord(DateMenuHW)      ].LastLine  := ord(HLdL);
  438.  
  439.   HelpWndw [ord(UpdateMenuHW)    ].FirstLine := ord(HLu1);
  440.   HelpWndw [ord(UpdateMenuHW)    ].LastLine  := ord(HLuL);
  441.  
  442.   HelpWndw [ord(ExecChoiceHW)    ].FirstLine := ord(HLx1);
  443.   HelpWndw [ord(ExecChoiceHW)    ].LastLine  := ord(HLxL);
  444.  
  445.   HelpWndw [ord(SingleChoiceHW)  ].FirstLine := ord(HLs1);
  446.   HelpWndw [ord(SingleChoiceHW)  ].LastLine  := ord(HLsL);
  447.  
  448.   HelpWndw [ord(MultipleChoiceHW)].FirstLine := ord(HLm1);
  449.   HelpWndw [ord(MultipleChoiceHW)].LastLine  := ord(HLmL);
  450.  
  451.   HelpWndw [ord(NumericHW)       ].FirstLine := ord(HLn1);
  452.   HelpWndw [ord(NumericHW)       ].LastLine  := ord(HLnL);
  453.  
  454.   HelpWndw [ord(TextHW)          ].FirstLine := ord(HLtx1);
  455.   HelpWndw [ord(TextHW)          ].LastLine  := ord(HLtxL);
  456.  
  457.   { ------------------- Set up your Help Lines here: ------------------------ }
  458.   HelpLine[ord(HLw1)]:='              WELCOME TO PULL15.ARC';
  459.   HelpLine[ord(HLw2)]:='These files will enable you to do fully developed';
  460.   HelpLine[ord(HLw3)]:='pull-down menus along with:';
  461.   HelpLine[ord(HLw4)]:='   - Work window(s)';
  462.   HelpLine[ord(HLw5)]:='   - Top, Main, and Multiple Submenus';
  463.   HelpLine[ord(HLw6)]:='     . Each menu can have 1 of 5 menu modes';
  464.   HelpLine[ord(HLw7)]:='     . Each line can have 1 of 7 line modes';
  465.   HelpLine[ord(HLw8)]:='   - Data entry windows';
  466.   HelpLine[ord(HLw9)]:='   - Help windows for each of the above';
  467.   HelpLine[ord(HLw10)]:='   - Pull/Pop remembers last menu';
  468.   HelpLine[ord(HLwL)]:='   - Message lines for prompts and processing';
  469.  
  470.   HelpLine[ord(HLt1)]:='Move cursor and press return OR type a command';
  471.   HelpLine[ord(HLtL)]:='letter.  ESC to return to the Work window.';
  472.  
  473.   HelpLine[ord(HLb1)]:='Notice the number of levels for the menus.  This';
  474.   HelpLine[ord(HLb2)]:='menu is a "Single Choice" menu, but you can choose';
  475.   HelpLine[ord(HLb3)]:='from 1 of 5 menu modes:';
  476.   HelpLine[ord(HLb4)]:='  1. ExecChoice         - process';
  477.   HelpLine[ord(HLb5)]:='  2. ExecSingleChoice   - process and flag';
  478.   HelpLine[ord(HLb6)]:='  3. ExecMultipleChoice - process and toggle flag';
  479.   HelpLine[ord(HLb7)]:='  4. SingleChoice       - flag';
  480.   HelpLine[ord(HLbL)]:='  5. MultipleChoice     - toggle flag';
  481.  
  482.   HelpLine[ord(HLf1)]:='This is a "Execute Single Choice" menu, but there';
  483.   HelpLine[ord(HLf2)]:='are 5 of the 7 possible line modes used here:';
  484.   HelpLine[ord(HLf3)]:='* 1. Choice     - interact with other menu choices';
  485.   HelpLine[ord(HLf4)]:='* 2. ExecOnly   - process but do not flag';
  486.   HelpLine[ord(HLf5)]:='* 3. Comment    - bypassed by highlight';
  487.   HelpLine[ord(HLf6)]:='* 4. Partition  - mid-menu border';
  488.   HelpLine[ord(HLf7)]:='* 5. ToDataWndw - pulls data entry window';
  489.   HelpLine[ord(HLf8)]:='  6. ToSubMenu  - pulls next submenu level';
  490.   HelpLine[ord(HLf9)]:='  7. ToUserWndw - pulls a user defined window';
  491.   HelpLine[ord(HLfL)]:='Any combination of the seven works!';
  492.  
  493.   HelpLine[ord(HLe1)]:='Each data entry window can be tailored to any type';
  494.   HelpLine[ord(HLe2)]:='of data:';
  495.   HelpLine[ord(HLe3)]:='  1. Byte        - 0..255';
  496.   HelpLine[ord(HLe4)]:='  2. Integer     - -32767..32767';
  497.   HelpLine[ord(HLe5)]:='  3. Real        - any range or format';
  498.   HelpLine[ord(HLe6)]:='  4. UserNums    - user defined numbers, like hex';
  499.   HelpLine[ord(HLe7)]:='  5. Char        - one character';
  500.   HelpLine[ord(HLe8)]:='  6. String      - any length';
  501.   HelpLine[ord(HLe9)]:='  7. UserStrings - strings limited by special sets';
  502.   HelpLine[ord(HLe10)]:='Data entry will check validity, range, and user-';
  503.   HelpLine[ord(HLe11)]:='defined limits.   Sets will limit data entry to';
  504.   HelpLine[ord(HLe12)]:='valid characters only.  Field length and labels';
  505.   HelpLine[ord(HLeL)]:='are also user-defined.';
  506.  
  507.   HelpLine[ord(HLi1)]:='This is an "Execute Choice" menu.  But sure to see';
  508.   HelpLine[ord(HLi2)]:='the example of sequential data entry on "Date" and';
  509.   HelpLine[ord(HLiL)]:='menu control on "Update".';
  510.  
  511.   HelpLine[ord(HLd1)]:='This is an "Execute Choice" menu, but there are no';
  512.   HelpLine[ord(HLd2)]:='"choice" lines.  Instead, the lines are all data';
  513.   HelpLine[ord(HLd3)]:='entry lines that have been made to allow either';
  514.   HelpLine[ord(HLdL)]:='random or sequential access.  Start with "Month".';
  515.  
  516.   HelpLine[ord(HLu1)]:='This is an "Execute Choice" menu.  This one will';
  517.   HelpLine[ord(HLu2)]:='show you a few of the possibilities of actually';
  518.   HelpLine[ord(HLuL)]:='controlling the menus themselves.';
  519.  
  520.   HelpLine[ord(HLx1)]:='        This is an "Execute Choice" menu.';
  521.   HelpLine[ord(HLx2)]:='         Notice that there are no flags.';
  522.   HelpLine[ord(HLxL)]:='   "'#240'" means linked SubMenu; "'#250'" - DataWndw.';
  523.  
  524.   HelpLine[ord(HLs1)]:='         This is a "Single Choice" menu.';
  525.   HelpLine[ord(HLs2)]:='          Notice there''s only one flag.';
  526.   HelpLine[ord(HLsL)]:='   "'#240'" means linked SubMenu; "'#250'" - DataWndw.';
  527.  
  528.   HelpLine[ord(HLm1)]:='        This is a "Multiple Choice" menu.';
  529.   HelpLine[ord(HLm2)]:='              Notice several flags.';
  530.   HelpLine[ord(HLmL)]:='   "'#240'" means linked SubMenu; "'#250'" - DataWndw.';
  531.  
  532.   HelpLine[ord(HLn1)]:='This is a numeric scratch pad.  Enter data between';
  533.   HelpLine[ord(HLn2)]:='the symbols.  Only certain characters are valid.';
  534.   HelpLine[ord(HLnL)]:='BS is active.  To clear, ESC+CR. Try to mess up!.';
  535.  
  536.   HelpLine[ord(HLtx1)]:='This is a text scratch pad.  Enter data between';
  537.   HelpLine[ord(HLtxL)]:='the symbols shown.  DEL+CR allows a null entry.';
  538.  
  539.   { ------------------ Set up your Message Lines here: ---------------------- }
  540.   { Concatonations here allow source to print on 80 col printer. }
  541.   { MsgLine[1] is reserved as the Work window message line. }
  542.   { MsgLine[2] is reserved as the top menu message line. }
  543.  
  544.   MsgLine[1]:=' F1-help  F2-pull  F10-cmd  ESC-pull    '+
  545.               '                                        ';
  546.   MsgLine[2]:=' F1-help  F2-pop   LTR-cmd  ESC-return  '+
  547.               '        '^[^Z' hilight            CR-select ';
  548.   MsgLine[3]:=' F1-help  F2-pop   LTR-cmd  ESC-return  '+
  549.               '        '^[^Z' menus  '^X^Y'-hilight  CR-select ';
  550.   MsgLine[4]:=' F1-help  F2-pop   LTR-cmd  ESC-return  '+
  551.               '                  '^X^Y'-hilight  CR-select ';
  552.   MsgLine[5]:=' F1-help  F2-pop   F10-cmd  ESC-return  '+
  553.               '                              CR-enter  ';
  554.   MsgLine[6]:=' F1-help  F2-pop            ESC-return  '+
  555.               '                    DEL-null  CR-enter  ';
  556.   MsgLine[7]:=' F1-return                  ESC-return  '+
  557.               '                                        ';
  558.   MsgLine[8]:=' Processing ...                         '+
  559.               '                                        ';
  560.   MsgLine[9]:=' F1-help  F2-pull  F10-cmd  ESC-pull    '+
  561.               '                              CR-enter  ';
  562.  
  563. { ---------------- Set up your Error Message Lines here: -------------------- }
  564.   { ErrMsgLine[1] is reserved for the Invalid numerical entries. }
  565.  
  566.   ErrMsgLine[1]:=' Invalid entry.             ESC-acknowledge';
  567.   ErrMsgLine[2]:=' $2500 limit.               ESC-acknowledge';
  568.   ErrMsgLine[3]:=' Range is:  -300 >= WorkWndwInteger >= 4000;  Press ESC';
  569.   ErrMsgLine[4]:=' Enter 1..12                ESC-acknowledge';
  570.   ErrMsgLine[5]:=' Enter 1..31                ESC-acknowledge';
  571.   ErrMsgLine[6]:=' Range is:  1960 >= Year >= 2010;  Press ESC';
  572.  
  573. end;  { procedure GetUserPullStats }
  574.  
  575. { *****************************    STEP 3   ********************************* }
  576. { You can OVERRIDE the automatic Colors, Sizes, and Locations here. }
  577.  
  578. procedure GetOverrideStats;
  579. begin
  580. { DataWndw[ord(StringsDW)].RowAlt:=10;
  581.   DataWndw[ord(StringsDW)].ColAlt:=3 }
  582.   with SubMenu[ord(BrandsMenu)] do
  583.     begin
  584.       Wattr:= Attr(black,brown);
  585.       Battr:= Attr(black,brown);
  586.       if Vmode<>7 then
  587.         begin
  588.           Hattr:=Attr(yellow,black);
  589.           Lattr:=Attr(yellow,brown);
  590.         end;
  591.     end;
  592.   SubMenu[ord(DateMenu)].LinkDir:=Left;
  593.    { This following changes the command letters on Main Menu 1 to other than
  594.      1st letters.  '#00' is for inaccessible lines. }
  595.   MainMenu[ord(FilesMenu)].CmdLtrs:='GSA'#00'MBO';
  596. end;
  597.  
  598. { *****************************    STEP 4   ********************************* }
  599. { Your normal variables and procedures now go here: }
  600. { Here are some sample user variables. }
  601. var
  602.   aByte,Seats,Years,Month,Day:   byte;
  603.   aInteger,PriceLimit: integer;
  604.   aReal:       real;
  605.   aHex:        string[4];
  606.   aChar:       char;
  607.   aString:     MaxString;
  608.   HexSet:      set of char;
  609.   FileName:    string[12];
  610.   WorkWndwInteger,Year: integer;
  611.  
  612. { ---------------- Set up variables for data windows here: ------------------ }
  613. { Place your variables names here to interface with the menus.
  614.   MPulled is the Main Menu pulled and SPulled is the Submenu pulled.  HiLited
  615.   is the selection on that menu that called for the DataWndw.  I don't like
  616.   the method I chose here but it works well. }
  617. { Careful! -- there's NO type checking here.  You MUST be certain case
  618.   statement, DataWndw, and TypeOfData all match. }
  619.  
  620. procedure DataTransfer;   { (VAR ErrMsg: integer); }
  621. begin
  622.   with DataPad do
  623.   begin
  624.     if SPulled=0 then   { SPulled=0 when a Main Menu only is pulled. }
  625.       case MainMenuNames(MPulled) of
  626.         FilesMenu:
  627.            case HiLited of
  628.              1,3: Transfer (FileName);
  629.              5:;
  630.            end;
  631.         AutoPartsMenu:
  632.            case HiLited of
  633.              1..2:;
  634.              3: Transfer (Seats);
  635.            end;
  636.         EnterDataMenu:
  637.            case HiLited of
  638.              1: Transfer (aByte);
  639.              2: Transfer (aInteger);
  640.              3: Transfer (aReal);
  641.              4: begin
  642.                   Transfer (aHex);
  643.                   if StoreMode then
  644.                     for j:=1 to ord(aHex[0]) do aHex[j]:=upcase(aHex[j])
  645.                   else UserCharSet:=HexSet;
  646.                 end;
  647.              5: Transfer (aChar);
  648.              6: Transfer (aString);
  649.            end;
  650.         OptionsMenu:
  651.            case HiLited of
  652.                  { The following line shows how to place limits on data. }
  653.              7: if StoreMode and ((Idata>2500) or (Idata<=0)) then ErrMsg:=2
  654.                 else Transfer (PriceLimit);
  655.            end;
  656.         IRSmenu:
  657.            case HiLited of
  658.              7: Transfer (Years);
  659.            end;
  660.       end
  661.     else
  662.       case SubMenuNames(SPulled) of
  663.         DateMenu:
  664.            case HiLited of
  665.              1: if StoreMode and ((Bdata=0) or (Bdata>12)) then ErrMsg:=4
  666.                 else Transfer (Month);
  667.              2: if StoreMode and ((Bdata=0) or (Bdata>31)) then ErrMsg:=5
  668.                 else Transfer (Day);
  669.              3: if StoreMode and ((Idata<1960) or (Idata>2010)) then ErrMsg:=6
  670.                 else Transfer (Year);
  671.            end;
  672.       end  { case }
  673.   end  { with }
  674. end;
  675.  
  676. { *****************************    STEP 5   ********************************* }
  677. { Place procedures for Process and WorkWndw here. }
  678. procedure DummyProcess;
  679. begin
  680.   ShowMsg (8);
  681.   Delay (1000)
  682. end;
  683.  
  684. { *****************************    STEP 6   ********************************* }
  685. { Place your procedure names here to interface with "Exec-" type menus.
  686.   MPulled is the Main Menu pulled and SPulled is the SubMenu pulled.
  687.   HiLited is the selection on that menu. }
  688.  
  689. procedure Process;        { (MPulled,SPulled,HiLited: integer)  LOCAL!}
  690. begin
  691.   if SPulled=0 then   { SPulled=0 when a Main Menu only is pulled. }
  692.     case MainMenuNames(MPulled) of
  693.        FilesMenu:
  694.           case HiLited of
  695.             1..3: DummyProcess;
  696.           end;
  697.        UtilitiesMenu:
  698.           case HiLited of
  699.             1..7: DummyProcess;
  700.           end;
  701.        IRSmenu:
  702.           case HiLited of
  703.             2..5,7: DummyProcess;
  704.             6:;
  705.           end;
  706.        QuitMenu:
  707.           case HiLited of
  708.             1:;
  709.             2: begin
  710.                  PopToWorkWndw:=true;
  711.                  Quit:=true
  712.                end;
  713.           end;
  714.     end
  715.   else
  716.     case SubMenuNames(SPulled) of
  717.       UpdateMenu:
  718.          case HiLited of
  719.            1: DummyProcess;
  720.            2: begin
  721.                { The following line are how you process first and then pop
  722.                  the menu. }
  723.                 DummyProcess;
  724.                 PopToWorkWndw:=true
  725.               end;
  726.            3:  { The following line is how you pop the menus first and
  727.                  then process. }
  728.               if Popped then DummyProcess;
  729.            4: begin
  730.                { The following lines are how you pop the menus first,
  731.                  process, and then pull the same menu(s) again which is good
  732.                  for updating the work window. }
  733.                 if Popped then DummyProcess;
  734.                 Pull:=true
  735.               end;
  736.            5: begin
  737.                { The following lines are how you pop by a number of levels
  738.                  so that part of the menus will remain displayed while
  739.                  going to another submenu. }
  740.                 PopLevels:=1;
  741.                 Pull:=true;
  742.                 MoreCmdSeq:='Y'
  743.               end;
  744.            6: begin
  745.                { The following lines are how you go to a completely
  746.                  different menu. }
  747.                 PopToTop:=true;
  748.                 Pull:=true;
  749.                 MoreCmdSeq:='AR'
  750.               end;
  751.          end;
  752.         { The following is how to enter a sequence of entries. }
  753.       DateMenu:
  754.          case HiLited of
  755.            1: begin
  756.                 Pull:=true;
  757.                 MoreCmdSeq:='D'
  758.               end;
  759.            2: begin
  760.                 Pull:=true;
  761.                 MoreCmdSeq:='Y'
  762.               end;
  763.            3: PopLevels:=1;
  764.          end;
  765.     end;  { case }
  766.   if not(PopToWorkWndw or PopToTop or (PopLevels>0) or Pull) then
  767.     if SPulled=0 then
  768.          ShowMsg (MainMenu[MPulled].MsgLineNum)
  769.     else ShowMsg (SubMenu [SPulled].MsgLineNum);
  770. end;
  771.  
  772. { *****************************    STEP 7   ********************************* }
  773. { This procedure will have all the procedures for the Work window(s). }
  774.  
  775. procedure WorkWndw;
  776. var TestString: MaxString;
  777.     j:          integer;
  778. begin
  779.   ShowMsg (1);
  780.   case WorkWndwStep of
  781.     0:  begin
  782.           DataPad.NewData:=true; { Initialize DataPad !! It's only needed once
  783.               but you can force the data to be new at each step if you want.  }
  784.           Qfill  (20, 2,1,CRTcols-2,-1,' ');
  785.           Str    (WorkWndwInteger:4,TestString);
  786.           Qwrite (19,24,-1,'Work window integer = '+TestString);
  787.           Qwrite (20,27,-1,'Press CR to enter new value:');
  788.           GotoRC (20,55);
  789.           ReadKB (ExtKey,Key);
  790.           if HelpKeyPressed then PullHelpWndw (1,'work window');
  791.           if Key=RetKey then
  792.             begin
  793.               WorkWndwStep:=1;
  794.               Qfill  (20, 2,1,CRTcols-2,-1,' ');
  795.               Qwrite (20,30,-1,'Enter integer:')
  796.             end
  797.         end;
  798.     1:  begin
  799.           repeat
  800.             WorkWndwEntry (20,46,4,WorkWndwInteger,Integers,Right,
  801.                            ord(NumericHW),'Work window entry');
  802.             if (WorkWndwInteger<-300) or (WorkWndwInteger>4000) then
  803.               RestoreData (WorkWndwInteger,3);       { Sets Key=' '. }
  804.           until DataPad.DataStored or not (Key=' ');
  805.           if Key=RetKey then
  806.             begin
  807.               Qfill  (20, 2,1,CRTcols-2,-1,' ');
  808.               Str    (WorkWndwInteger:4,TestString);
  809.               Qwrite (19,46,-1,TestString);
  810.               Qwrite (20,22,-1,'Press CR for multi-level work windows:');
  811.               GotoRC (20,60);
  812.               WorkWndwStep:=2
  813.             end
  814.         end;
  815.     2:  begin
  816.           ReadKB (ExtKey,Key);
  817.           if HelpKeyPressed then PullHelpWndw (1,'work window');
  818.           if Key=RetKey then
  819.             begin
  820.               for i:=0 to 1 do
  821.                 for j:=0 to 4 do
  822.                 begin
  823.                   MakeWindow (5+j*2+i*2,23+j*8-i*18,8,21,Attr(black,green),
  824.                               Attr(lightgreen,black),SingleBrdr);
  825.                   Str (LI,TestString);
  826.                   TitleWindow (Center,' Work Window '+TestString+' ');
  827.                   with WndwStat[LI] do
  828.                     begin
  829.                       Qwrite (WSrow+3,WScol+5, -1,'Press CR or');
  830.                       Qwrite (WSrow+4,WScol+5, -1,'pull menus')
  831.                     end
  832.                 end;
  833.               WorkWndwStep:=3
  834.             end
  835.         end;
  836.     3:  begin
  837.           ReadKB (ExtKey,Key);
  838.           if HelpKeyPressed then PullHelpWndw (1,'work window');
  839.           if Key=RetKey then
  840.             begin
  841.               for i:=LI downto 2 do RemoveWindow;
  842.               WorkWndwStep:=0
  843.             end
  844.         end;
  845.   end  { case }
  846. end;
  847.  
  848. { *****************************    STEP 8   ********************************* }
  849. { Set up initial display layout here. }
  850.  
  851. procedure DisplayScreen;
  852. var ColL,ColR: integer;
  853. begin
  854.   Qwrite (1,1,lightgray,'PULLDEMO v1.5             Multi-level Pu'+
  855.                         'll-down Menus        (c) 1987  J H LeMay');
  856.   ShowTopMenu;
  857.   FixedWindow:=true;
  858.   MakeWindow (3,1,CRTrows-3,CRTcols,Attr(white,blue),Attr(lightgray,black),
  859.               DoubleBrdr);
  860.   with WndwStat[LI] do
  861.   begin
  862.     ColL:=WScol; ColR:=pred(WScol+WScols);
  863.     QwriteC ( 7,ColL,ColR,-1,'PULL15.INC - MULTI-LEVEL PULL-DOWN MENUS');
  864.     QwriteC (11,ColL,ColR,-1,'Use F1 everywhere for some descriptions.');
  865.     QwriteC (12,ColL,ColR,-1,'Use ''Quit'' to exit demo program.');
  866.     QwriteC (13,ColL,ColR,-1,'Be sure to try a CR at "'#240'" marked lines.');
  867.     QwriteC (14,ColL,ColR,-1,'Also try all the EnterData lines.');
  868.     QwriteC (16,ColL,ColR,Attr(yellow,blue),'This is Work Window 1.');
  869.     GotoRC (WSrow+17,WScol+26)
  870.   end
  871. end;
  872.  
  873. { *****************************    STEP 9   ********************************* }
  874. { It's all yours from here: }
  875. begin
  876.   InitPull (lightgray);       { <<-- Be sure you do this!! }
  877.   DisplayScreen;
  878.   WorkWndwStep:=0;            { Step number of where you want to start in the
  879.                                 Work window. }
  880.     Seats:=4;
  881.     aByte:= 129;
  882.     aInteger:=-31456;
  883.     aReal:=-24.34565E06;
  884.     HexSet:=['0'..'9','A'..'F','a'..'f',BSkey];
  885.     aHex:='FF03';
  886.     aChar:='Q';
  887.     aString:='This is a string';
  888.     FileName:='testfile.txt';
  889.     Years:=30;
  890.     Month:=8; Day:=31; Year:=1987;
  891.     PriceLimit:=2000;
  892.     WorkWndwInteger:=0;
  893.  
  894.   GotoKeyDispatcher;          { <<-- All keyboard entries go through here! }
  895.   Qfill (1,1,CRTrows,CRTcols,InitAttr,' ');
  896.   GotoRC (CRTrows,1)
  897. end.