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

  1. { PullShel.pas - a skeleton shell for your application.     ver 1.5, 08-31-87 }
  2. { Use this shell to start your application program.  As is, this program will }
  3. { compile and run. }
  4.  
  5. { *****************************    STEP 1   ********************************* }
  6. { C-}     { Set to $C- when your program is debugged }
  7.  
  8. {$I qwik30.inc }
  9.  
  10. const
  11.   MaxWndw = 20;              { Max Number of Windows on display at one time. }
  12. {$I window34.inc }
  13.  
  14. const
  15.   MaxMenuLines     = 20;     { For Main and Sub menus }
  16.   MaxCharsPerLine  = 40;     { For Main and Sub menus and Data Windows }
  17.   MaxStringLength  = 80;     { Screen limit }
  18.   LastMainMenu     =  2;     { 1 - 255; use exact number here! }
  19.   NumOfMainMenus   =  2;     { 1 - 255 }
  20.   NumOfSubMenus    =  3;     { 1 - 255 }
  21.   NumOfDataWndws   = 10;     { 1 - 255 }
  22.   NumOfHelpWndws   = 10;     { 1 - 255 }
  23.   NumOfMsgLines    = 10;     { 1 - 255 }
  24.   NumOfErrMsgLines = 10;     { 1 - 32767 }
  25.   MaxErrStrLength  = 80;     { Error messages are usually shorter }
  26.   TotalHelpLines   = 50;     { 2 - Screen limit }
  27.   HelpCharsPerLine = 50;     { 1 - Screen limit }
  28. {$I pull15.inc }
  29. {$I pullde15.inc }    { or use pullde__.inc to delete data entry package }
  30. {$I pulluser.inc }    { for special windows or menus }
  31.  
  32. { *****************************    STEP 2   ********************************* }
  33.  
  34. { ------------------ Set up your window names here in order: ---------------- }
  35. { This is optional, but it sure helps you in not only understanding the
  36.   program, but also makes it unquestionably easier to rearrange.              }
  37.  
  38. type
  39.   MainMenuNames = (NoMainMenu,FirstMenu,QuitMenu);
  40.   SubMenuNames  = (NoSubMenu,S1Menu,S2Menu,S3Menu,S4Menu);
  41.   DataWndwNames = (NoDW,BytesDW,IntegersDW,RealsDW,CharsDW,StringsDW,
  42.                    FileNameDW);
  43.   HelpWndwNames = (NoHW,WorkWndwHW,TopMenuHW,MainMenuHW,SubMenuHW,
  44.                    NumericHW,TextHW);
  45.   HelpLineNames = (NoHL,               { HL - HelpLine;  L  - Last }
  46.                    HLw1,HLw2,HLw3,HLw4,HLw5,HLwL,  { for WorkWndwHW }
  47.                    HLt1,HLt2,HLt3,HLt4,HLt5,HLtL,  { for TopMenuHW }
  48.                    HLm1,HLm2,HLm3,HLm4,HLm5,HLmL,  { for MainMenuHW }
  49.                    HLs1,HLs2,HLs3,HLs4,HLs5,HLsL,  { for SubMenuHW }
  50.                    HLn1,HLn2,HLn3,HLn4,HLn5,HLnL,  { for NumericHW }
  51.                    HLtx1,HLtx2,HLtx3,HLtx4,HLtx5,HLtxL); { for TextHW }
  52.  
  53. { Careful! - Always test your last main menu, submenu, data window, and help
  54.   window for run-time error!  It makes sure you have allotted enough memory
  55.   with your constants.  The compiler cannot check it with these typed scalars.)
  56.  
  57. { ----------------------- User information starts here: --------------------- }
  58. procedure GetUserPullStats;
  59. begin
  60.   LocationWarning:=true;   { If true and a Submenu won't fit, a message is
  61.                              displayed.  If false, you can override the
  62.                              location without the message. }
  63.   case ActiveDD of
  64.     EgaColor..VgaColor: CRTrows:=succ(EgaRows);
  65.   else CRTrows:=25;
  66.   end;
  67.  
  68.   { This is all the configuration data.  The program first clears all
  69.     RECORD values to $00.  The values below will set new values.  Therefore,
  70.     setting RECORD values to "false" or the like is not necessary. }
  71.  
  72.   { ------------------ Set up your colors and borders here: ---------------- }
  73.  
  74.   TopMenuAttr:=  Attr(black,lightgray); TopMenuHattr:= Attr(white,black);
  75.  
  76.   MainMenuBattr:=Attr(lightgray,black);
  77.   MainMenuHattr:=Attr(black,lightgray); MainMenuLattr:=Attr(yellow,black);
  78.   MainMenuCattr:=Attr(lightgray,black);
  79.  
  80.   SubMenuWattr:= Attr(black,cyan);      SubMenuBattr:= Attr(black,cyan);
  81.  
  82.   if Vmode=7 then
  83.     begin
  84.       TopMenuLattr :=TopMenuAttr;
  85.       MainMenuWattr:=Attr(lightgray,black    );
  86.       SubMenuHattr :=Attr(black    ,lightgray);
  87.       SubMenuLattr :=Attr(white    ,black    );  { :=white;     }
  88.       SubMenuCattr :=Attr(lightgray,black    );  { :=lightgray; }
  89.     end
  90.   else
  91.     begin
  92.       TopMenuLattr :=Attr(red      ,lightgray);
  93.       MainMenuWattr:=Attr(white    ,black    );
  94.       SubMenuHattr :=Attr(white    ,blue     );
  95.       SubMenuLattr :=Attr(white    ,cyan     );
  96.       SubMenuCattr :=Attr(blue     ,cyan     );
  97.     end;
  98.  
  99.   DataWndwWattr:=Attr(black,brown);     DataWndwBattr:=Attr(black,brown);
  100.   HelpWndwWattr:=Attr(black,green);     HelpWndwBattr:=Attr(black,lightgray);
  101.   MsgLineAttr  :=Attr(green,black);
  102.  
  103.   Brdr[UserBrdr]:=Brdr[MixedBrdr];   { Give Main menus a custom border. }
  104.   with Brdr[UserBrdr] do
  105.   begin
  106.     BL:=Brdr[SingleBrdr].BL;
  107.     BH:=Brdr[SingleBrdr].BH;
  108.     BR:=Brdr[SingleBrdr].BR
  109.   end;
  110.   MainMenuBrdr:=UserBrdr;               SubMenuBrdr :=SingleBrdr;
  111.   DataWndwBrdr:=MixedBrdr;              HelpWndwBrdr:=MixedBrdr;
  112.   HelpZoom:=true;                       HelpShadow:=Right;
  113.   RowsBelowHelp:=4;                     RowsBelowMsg:=0;
  114.  
  115.   { ------------------------- Top Menu defaults ----------------------------- }
  116.   TopMenuRow:=2;        { Top menu to appear on row 2 }
  117.   MPulled:=1;           { Main menu title to be HiLited when F10 is pressed. }
  118.   MoreCmdSeq:='F';      { Sequence of command letter(s) as if keyed in.  This }
  119.                         { will be the default menu(s) pulled. }
  120.   Pull:=false;          { Set this true if you want the command sequence}
  121.                         {  to pull down the menus at startup. }
  122.  
  123.   { ------------------- Set up your MainMenu records here: ------------------ }
  124.   MainMenuRow:=3;       { First row of Main menus to appear on screen row 3 }
  125.   with MainMenu[ord(FirstMenu)] do
  126.   begin
  127.     MenuMode:=ExecSingleChoice; SingleFlagLine:=5;
  128.     Title:='FirstMenu';
  129.     Line[1]:='Get';             LineMode[1]:=ToDataWndw;
  130.                                 LinkNum [1]:=ord(FileNameDW);
  131.     Line[2]:='Save';            LineMode[2]:=ExecOnly;
  132.     Line[3]:='save As';         LineMode[3]:=ToDataWndw;
  133.                                 LinkNum [3]:=ord(FileNameDW);
  134.     Line[4]:='────────────';    LineMode[4]:=Comment;
  135.     Line[5]:='Merge';
  136.     Line[6]:='make Backup';
  137.     Line[7]:='text Out';
  138.     Line[8]:='';                LineMode[8]:=Partition;   LinkNum[8]:=11;
  139.     Line[9]:='Help comment';    LineMode[9]:=Comment;     LinkNum[9]:=11;
  140.     MenuLines:=9;               DefaultLine:=6;
  141.     MsgLineNum:=3;              HelpWndwNum:=ord(MainMenuHW);
  142.   end;
  143.   with MainMenu[ord(QuitMenu)] do
  144.   begin
  145.   { MenuMode:=ExecChoice; }     { This is the default }
  146.     Title:='Quit';
  147.     Line[1]:='Stay';
  148.     Line[2]:='Quit';
  149.     MenuLines:=2;               DefaultLine:=1;  BackToDefault:=true;
  150.     MsgLineNum:=3;              HelpWndwNum:=ord(MainMenuHW);
  151.   end;
  152.  
  153.   { ----------------------- Set up your SubMenus here: --------------------- }
  154.   { Careful! -- indexes to SubMenus must be numbered in order of level; i.e.,
  155.     ALL SubMenus first, ALL SubSubMenus second, ALL SubSubSubMenus, ... etc. }
  156.   with SubMenu[ord(S1Menu)] do
  157.     begin
  158.       MenuMode:=SingleChoice;     SingleFlagLine:=5;
  159.       Line[1]:='Brands';          LineMode[1]:=ToSubMenu;
  160.                                   LinkNum [1]:=ord(S2Menu);
  161.       Line[2]:='Radials';
  162.       Line[3]:='Knobbies';
  163.       Line[4]:='Track';
  164.       Line[5]:='Snow';
  165.       Line[6]:='All-Weather';
  166.       Line[7]:='4-ply';
  167.       MenuLines:=7;               DefaultLine:=1;
  168.       MsgLineNum:=4;              HelpWndwNum:=ord(SubMenuHW);
  169.     end;
  170.  
  171.   { ----------------- Set up your Data Windows here: --------------------- }
  172.   { Justification will default with numbers right justified and string to  }
  173.   { the left if none is specified.                                         }
  174.   AutoNumLock:=true;          { Turns NumLock on with numeric window }
  175.   NumLockCol:=42;             { Column to write 'NUMLOCK' on message line. }
  176.   with DataWndw[ord(BytesDW)] do
  177.     begin
  178.       Line[1]:='Currently:';
  179.       Line[2]:='Enter byte:';
  180.     { TypeOfData:=Bytes; }        { This is the default }
  181.       Field:=3;
  182.     { Justify:=Right; }           { This is the default }
  183.       MsgLineNum:=5;              HelpWndwNum:=ord(NumericHW);
  184.     end;
  185.   with DataWndw[ord(IntegersDW)] do
  186.     begin
  187.       Line[1]:='Currently:';
  188.       Line[2]:='Enter integer:';
  189.       TypeOfData:=Integers;
  190.       Field:=6;
  191.       MsgLineNum:=5;              HelpWndwNum:=ord(NumericHW);
  192.     end;
  193.   with DataWndw[ord(RealsDW)] do
  194.     begin
  195.       Line[1]:='Currently:';
  196.       Line[2]:='Enter real:';
  197.       TypeOfData:=Reals;
  198.       Field:=17;
  199.       Decimals:=08;              { Neg value uses R:F.  Pos value - R:F:D. }
  200.       MsgLineNum:=5;              HelpWndwNum:=ord(NumericHW);
  201.     end;
  202.   with DataWndw[ord(CharsDW)] do
  203.     begin
  204.       Line[1]:='Currently:';
  205.       Line[2]:='Enter char:';
  206.       TypeOfData:=Chars;
  207.       Field:=1;
  208.       MsgLineNum:=6;              HelpWndwNum:=ord(TextHW);
  209.     end;
  210.   with DataWndw[ord(StringsDW)] do
  211.     begin
  212.       Line[1]:='Currently:';
  213.       Line[2]:='Enter string:';
  214.       TypeOfData:=Strings;
  215.       Field:=25;                 { If field is too large to fit, program
  216.                                    centers it on screen. You can override. }
  217.       MsgLineNum:=6;              HelpWndwNum:=ord(TextHW);
  218.     end;
  219.   with DataWndw[ord(FileNameDW)] do
  220.     begin
  221.       Line[1]:='Currently:';
  222.       Line[2]:='Enter name:';
  223.       TypeOfData:=Strings;
  224.       Field:=12;
  225.       MsgLineNum:=6;              HelpWndwNum:=ord(TextHW);
  226.     end;
  227.  
  228.   { ----------------------- Set up your Help Windows here: ------------------ }
  229.   { HelpWndw[1] is reserved for the Work window. }
  230.   { HelpWndw[2] is reserved for the top menu. }
  231.  
  232.   HelpMsgLineNum:=7;                { Standard message for a Help window }
  233.  
  234.   { For 2 assignments to a record, save code by not using WITH }
  235.   HelpWndw [ord(WorkWndwHW)].FirstLine := ord(HLw1);
  236.   HelpWndw [ord(WorkWndwHW)].LastLine  := ord(HLwL);
  237.  
  238.   HelpWndw [ord(TopMenuHW) ].FirstLine := ord(HLt1);
  239.   HelpWndw [ord(TopMenuHW) ].LastLine  := ord(HLtL);
  240.  
  241.   HelpWndw [ord(MainMenuHW)].FirstLine := ord(HLm1);
  242.   HelpWndw [ord(MainMenuHW)].LastLine  := ord(HLmL);
  243.  
  244.   HelpWndw [ord(SubMenuHW) ].FirstLine := ord(HLs1);
  245.   HelpWndw [ord(SubMenuHW) ].LastLine  := ord(HLsL);
  246.  
  247.   HelpWndw [ord(NumericHW) ].FirstLine := ord(HLn1);
  248.   HelpWndw [ord(NumericHW) ].LastLine  := ord(HLnL);
  249.  
  250.   HelpWndw [ord(TextHW)    ].FirstLine := ord(HLtx1);
  251.   HelpWndw [ord(TextHW)    ].LastLine  := ord(HLtxL);
  252.  
  253.   { ------------------- Set up your Help Lines here: ------------------------ }
  254.   HelpLine[ord(HLw1)]:='              WELCOME TO MY PROGRAM';
  255.   HelpLine[ord(HLw2)]:='This is one of the easiest human interfaces around';
  256.   HelpLine[ord(HLw3)]:='with pull-down menus and context-sensitive help';
  257.   HelpLine[ord(HLw4)]:='window.';
  258.   HelpLine[ord(HLw5)]:='';
  259.   HelpLine[ord(HLwL)]:='';
  260.  
  261.   HelpLine[ord(HLt1)]:='Move cursor and press return OR type a command';
  262.   HelpLine[ord(HLt2)]:='letter.  ESC to return to the Work window.';
  263.   HelpLine[ord(HLt3)]:='';
  264.   HelpLine[ord(HLt4)]:='';
  265.   HelpLine[ord(HLt5)]:='';
  266.   HelpLine[ord(HLtL)]:='';
  267.  
  268.   HelpLine[ord(HLm1)]:='This help window can be used for Main Menus.';
  269.   HelpLine[ord(HLm2)]:='';
  270.   HelpLine[ord(HLm3)]:='';
  271.   HelpLine[ord(HLm4)]:='';
  272.   HelpLine[ord(HLm5)]:='';
  273.   HelpLine[ord(HLmL)]:='';
  274.  
  275.   HelpLine[ord(HLs1)]:='This help window can be used for SubMenus.';
  276.   HelpLine[ord(HLs2)]:='';
  277.   HelpLine[ord(HLs3)]:='';
  278.   HelpLine[ord(HLs4)]:='';
  279.   HelpLine[ord(HLs5)]:='';
  280.   HelpLine[ord(HLsL)]:='';
  281.  
  282.   HelpLine[ord(HLn1)]:='This is a numeric scratch pad.  Enter data between';
  283.   HelpLine[ord(HLn2)]:='the symbols.  Only certain characters are valid.';
  284.   HelpLine[ord(HLn3)]:='BS is active.  To clear, ESC+CR.';
  285.   HelpLine[ord(HLn4)]:='';
  286.   HelpLine[ord(HLn5)]:='';
  287.   HelpLine[ord(HLnL)]:='';
  288.  
  289.   HelpLine[ord(HLtx1)]:='This is a text scratch pad.  Enter data between';
  290.   HelpLine[ord(HLtx2)]:='the symbols shown.  DEL+CR allows a null entry.';
  291.   HelpLine[ord(HLtx3)]:='BS is active.';
  292.   HelpLine[ord(HLtx4)]:='';
  293.   HelpLine[ord(HLtx5)]:='';
  294.   HelpLine[ord(HLtxL)]:='';
  295.  
  296.   { ------------------ Set up your Message Lines here: ---------------------- }
  297.   { Concatonations here allow source to print on 80 col printer. }
  298.   { MsgLine[1] is reserved as the Work window message line. }
  299.   { MsgLine[2] is reserved as the top menu message line. }
  300.  
  301.   MsgLine[1]:=' F1-help  F2-pull  F10-cmd  ESC-pull    '+
  302.               '                                        ';
  303.   MsgLine[2]:=' F1-help  F2-pop   LTR-cmd  ESC-return  '+
  304.               '        '^[^Z' hilight            CR-select ';
  305.   MsgLine[3]:=' F1-help  F2-pop   LTR-cmd  ESC-return  '+
  306.               '        '^[^Z' menus  '^X^Y'-hilight  CR-select ';
  307.   MsgLine[4]:=' F1-help  F2-pop   LTR-cmd  ESC-return  '+
  308.               '                  '^X^Y'-hilight  CR-select ';
  309.   MsgLine[5]:=' F1-help  F2-pop   F10-cmd  ESC-return  '+
  310.               '                              CR-enter  ';
  311.   MsgLine[6]:=' F1-help  F2-pop            ESC-return  '+
  312.               '                    DEL-null  CR-enter  ';
  313.   MsgLine[7]:=' F1-return                  ESC-return  '+
  314.               '                                        ';
  315.   MsgLine[8]:=' Processing ...                         '+
  316.               '                                        ';
  317.   MsgLine[9]:=' F1-help  F2-pull  F10-cmd  ESC-pull    '+
  318.               '                              CR-enter  ';
  319.  
  320. { ---------------- Set up your Error Message Lines here: -------------------- }
  321.   { ErrMsgLine[1] is reserved for the Invalid numerical entries. }
  322.  
  323.   ErrMsgLine[1]:=' Invalid entry.             ESC-acknowledge';
  324.   ErrMsgLine[2]:=' Enter 1..12                ESC-acknowledge';
  325.  
  326. end;  { procedure GetUserPullStats }
  327.  
  328. { *****************************    STEP 3   ********************************* }
  329. { You can OVERRIDE the automatic Colors, Sizes, and Locations here. }
  330.  
  331. procedure GetOverrideStats;
  332. begin
  333.    { This following changes the command letters on Main Menu 1 to other than
  334.      1st letters.  '#00' is for inaccessible lines. }
  335.   MainMenu[ord(FirstMenu)].CmdLtrs:='GSA'#00'MBO';
  336. end;
  337.  
  338. { *****************************    STEP 4   ********************************* }
  339. { Your normal variables and procedures now go here: }
  340. { Here are some sample user variables. }
  341. var
  342.   aByte:       byte;
  343.   aInteger:    integer;
  344.   aReal:       real;
  345.   aChar:       char;
  346.   aString:     MaxString;
  347.   FileName:    string[12];
  348.   WorkWndwInteger: integer;
  349.  
  350. { ---------------- Set up variables for data windows here: ------------------ }
  351. { Place your variables names here to interface with the menus.
  352.   MPulled is the Main Menu pulled and SPulled is the Submenu pulled.  HiLited
  353.   is the selection on that menu that called for the DataWndw.  I don't like
  354.   the method I chose here but it works well. }
  355. { Careful! -- there's NO type checking here.  You MUST be certain case
  356.   statement, DataWndw, and TypeOfData all match. }
  357.  
  358. procedure DataTransfer;   { (VAR ErrMsg: integer); }
  359. begin
  360.   with DataPad do
  361.   begin
  362.     if SPulled=0 then   { SPulled=0 when a Main Menu only is pulled. }
  363.       case MainMenuNames(MPulled) of
  364.         FirstMenu:
  365.            case HiLited of
  366.              1,3: Transfer (FileName);
  367.              5:;
  368.            end;
  369.       end
  370.     else
  371.       case SubMenuNames(SPulled) of
  372.         S1Menu:
  373.            case HiLited of
  374.              1:;
  375.            end;
  376.       end  { case }
  377.   end  { with }
  378. end;
  379.  
  380. { *****************************    STEP 5   ********************************* }
  381. { Place procedures for Process and WorkWndw here. }
  382.  
  383. procedure DummyProcess;
  384. begin
  385.   ShowMsg (8);
  386.   Delay (1000)
  387. end;
  388.  
  389. { *****************************    STEP 6   ********************************* }
  390. { Place your procedure names here to interface with  "Exec-" type menus.
  391.   MPulled is the Main Menu pulled and SPulled is the SubMenu pulled.
  392.   HiLited is the selection on that menu. }
  393.  
  394. procedure Process;        { (MPulled,SPulled,HiLited: integer)  LOCAL!}
  395. begin
  396.   if SPulled=0 then   { SPulled=0 when a Main Menu only is pulled. }
  397.     case MainMenuNames(MPulled) of
  398.        FirstMenu:
  399.           case HiLited of
  400.             1..3: DummyProcess;
  401.           end;
  402.        QuitMenu:
  403.           case HiLited of
  404.             1:;
  405.             2: begin
  406.                  PopToWorkWndw:=true;
  407.                  Quit:=true
  408.                end;
  409.           end;
  410.     end
  411.   else
  412.     case SubMenuNames(SPulled) of
  413.       S1Menu:
  414.          case HiLited of
  415.            1: ;
  416.            2: ;
  417.          end;
  418.     end;  { case }
  419.   if not(PopToWorkWndw or PopToTop or (PopLevels>0) or Pull) then
  420.     if SPulled=0 then
  421.          ShowMsg (MainMenu[MPulled].MsgLineNum)
  422.     else ShowMsg (SubMenu [SPulled].MsgLineNum);
  423. end;
  424.  
  425. { *****************************    STEP 7   ********************************* }
  426. { This procedure will have all the procedures for the Work window(s). }
  427.  
  428. procedure WorkWndw;
  429. var TestString: MaxString;
  430.     j:          integer;
  431. begin
  432.   ShowMsg (1);
  433.   case WorkWndwStep of
  434.     0:  begin
  435.           DataPad.NewData:=true; { Initialize DataPad !! It's only needed once
  436.               but you can force the data to be new at each step if you want.  }
  437.           Qfill  (20, 2,1,CRTcols-2,-1,' ');
  438.           Str    (WorkWndwInteger:4,TestString);
  439.           Qwrite (19,24,-1,'Work window integer = '+TestString);
  440.           Qwrite (20,27,-1,'Press CR to enter new value:');
  441.           GotoRC (20,55);
  442.           ReadKB (ExtKey,Key);
  443.           if HelpKeyPressed then PullHelpWndw (1,'work window');
  444.           if Key=RetKey then
  445.             begin
  446.               WorkWndwStep:=1;
  447.               Qfill  (20, 2,1,CRTcols-2,-1,' ');
  448.               Qwrite (20,30,-1,'Enter integer:')
  449.             end
  450.         end;
  451.     1:  begin
  452.           repeat
  453.             WorkWndwEntry (20,46,4,WorkWndwInteger,Integers,Right,
  454.                            ord(NumericHW),'Work window entry');
  455.             if (WorkWndwInteger<-300) or (WorkWndwInteger>4000) then
  456.               RestoreData (WorkWndwInteger,3);       { Sets Key=' '. }
  457.           until DataPad.DataStored or not (Key=' ');
  458.           if Key=RetKey then
  459.             begin
  460.               Qfill  (20, 2,1,CRTcols-2,-1,' ');
  461.               Str    (WorkWndwInteger:4,TestString);
  462.               Qwrite (19,46,-1,TestString);
  463.               Qwrite (20,27,-1,'Press CR for work window 2:');
  464.               GotoRC (20,54);
  465.               WorkWndwStep:=2
  466.             end
  467.         end;
  468.     2:  begin
  469.           ReadKB (ExtKey,Key);
  470.           if HelpKeyPressed then PullHelpWndw (1,'work window');
  471.           if Key=RetKey then
  472.             begin
  473.               MakeWindow ( 8,30, 8,21,Attr(black,green),
  474.                               Attr(lightgreen,black),SingleBrdr);
  475.               TitleWindow (Center,' Work Window 2 ');
  476.               with WndwStat[LI] do
  477.                 begin
  478.                   Qwrite (WSrow+3,WScol+5, -1,'Press CR or');
  479.                   Qwrite (WSrow+4,WScol+5, -1,'pull menus')
  480.                 end;
  481.               WorkWndwStep:=3
  482.             end
  483.         end;
  484.     3:  begin
  485.           ReadKB (ExtKey,Key);
  486.           if HelpKeyPressed then PullHelpWndw (1,'work window');
  487.           if Key=RetKey then
  488.             begin
  489.               RemoveWindow;
  490.               WorkWndwStep:=0
  491.             end
  492.         end;
  493.   end  { case }
  494. end;
  495.  
  496. { *****************************    STEP 8   ********************************* }
  497. { Set up initial display layout here. }
  498.  
  499. procedure DisplayScreen;
  500. var ColL,ColR: integer;
  501. begin
  502.   Qwrite (1,1,lightgray,'PULLSHEL v1.5             Multi-level Pu'+
  503.                         'll-down Menus        (c) 1987  J H LeMay');
  504.   ShowTopMenu;
  505.   FixedWindow:=true;
  506.   MakeWindow (3,1,CRTrows-3,CRTcols,Attr(white,blue),Attr(lightgray,black),
  507.               DoubleBrdr);
  508.   with WndwStat[LI] do
  509.   begin
  510.     ColL:=WScol; ColR:=pred(WScol+WScols);
  511.     QwriteC ( 6,ColL,ColR,-1,'MULTI-LEVEL PULL-DOWN MENUS');
  512.     QwriteC (17,ColL,ColR,Attr(yellow,blue),'This is Work Window 1.');
  513.     GotoRC (WSrow+17,WScol+26)
  514.   end
  515. end;
  516.  
  517. { *****************************    STEP 9   ********************************* }
  518. { It's all yours from here: }
  519. begin
  520.   InitPull (lightgray);       { <<-- Be sure you do this!! }
  521.   DisplayScreen;
  522.   WorkWndwStep:=0;            { Step number of where you want to start in the
  523.                                 Work window. }
  524.     aByte:= 129;
  525.     aInteger:=-31456;
  526.     aReal:=-24.34565E06;
  527.     aChar:='Q';
  528.     aString:='This is a string';
  529.     FileName:='testfile.txt';
  530.     WorkWndwInteger:=0;
  531.  
  532.   GotoKeyDispatcher;          { <<-- All keyboard entries go through here! }
  533.   Qfill (1,1,CRTrows,CRTcols,InitAttr,' ');
  534.   GotoRC (CRTrows,1)
  535. end.