home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / turbo55 / install / tcalc.arc / TCMENU.PAS < prev    next >
Pascal/Delphi Source File  |  1989-05-02  |  6KB  |  234 lines

  1.  
  2. { Copyright (c) 1989 by Borland International, Inc. }
  3.  
  4. unit TCMenu;
  5. { Turbo Pascal 5.5 object-oriented example command line menu system.
  6.   This unit is used by TCALC.PAS.
  7.   See TCALC.DOC for an more information about this example.
  8. }
  9.  
  10. {$S-}
  11.  
  12. interface
  13.  
  14. uses Crt, TCUtil, TCScreen;
  15.  
  16. { The menus in this unit are very simple.  Each menu points to a parent (so
  17.   that ESC will take you back to the previous menu) and a list of items.
  18.   Each item is either a pointer to a procedure that will be executed when
  19.   you choose the item, or is a pointer to a new menu.
  20. }
  21.  
  22. type
  23.   MenuItemPtr = ^MenuItem;
  24.   MenuPtr = ^Menu;
  25.   Menu = object
  26.     MenuString, CommandString : StringPtr;
  27.     MenuItems, LastItem : MenuItemPtr;
  28.     Parent : MenuPtr;
  29.     constructor Init(InitMenuString : String; InitParent : MenuPtr);
  30.     procedure AddItem(NewItem : MenuItemPtr);
  31.     function AddItemProc(NewProc : ProcPtr) : Boolean;
  32.     function AddItemMenu(NewMenu : MenuPtr) : Boolean;
  33.     procedure RunMenu;
  34.     destructor Done;
  35.   end;
  36.   MenuItem = object
  37.     Next : MenuItemPtr;
  38.     constructor Init;
  39.     procedure RunItem(var CurrMenu : MenuPtr); virtual;
  40.   end;
  41.   MenuItemProcPtr = ^MenuItemProc;
  42.   MenuItemProc = object(MenuItem)
  43.     Proc : ProcPtr;
  44.     constructor Init(InitProc : ProcPtr);
  45.     procedure RunItem(var CurrMenu : MenuPtr); virtual;
  46.   end;
  47.   MenuItemMenuPtr = ^MenuItemMenu;
  48.   MenuItemMenu = object(MenuItem)
  49.     NewMenu : MenuPtr;
  50.     constructor Init(InitMenu : MenuPtr);
  51.     procedure RunItem(var CurrMenu : MenuPtr); virtual;
  52.   end;
  53.  
  54. implementation
  55.  
  56. constructor Menu.Init(InitMenuString : String; InitParent : MenuPtr);
  57. { Initializes a new menu }
  58. var
  59.   S : String;
  60.   Counter : Word;
  61. begin
  62.   MenuItems := nil;
  63.   LastItem := nil;
  64.   GetMem(MenuString, Succ(Length(InitMenuString)));
  65.   if MenuString = nil then
  66.     Fail;
  67.   MenuString^ := InitMenuString;
  68.   S := '';
  69.   for Counter := 1 to Length(InitMenuString) do
  70.   begin
  71.     if (InitMenuString[Counter] in ['A'..'Z']) then   
  72.          { Build command string based on upper case letters in mwenu string }
  73.       S := S + InitMenuString[Counter];
  74.   end;
  75.   GetMem(CommandString, Succ(Length(S)));
  76.   if CommandString = nil then
  77.   begin
  78.     Done;
  79.     Fail;
  80.   end;
  81.   CommandString^ := S;
  82.   Parent := InitParent;
  83. end; { Menu.Init }
  84.  
  85. destructor Menu.Done;
  86. { Removes a menu from memory }
  87. begin
  88.   if MenuString <> nil then
  89.     FreeMem(MenuString, Succ(Length(MenuString^)));
  90.   if CommandString <> nil then
  91.     FreeMem(CommandString, Succ(Length(CommandString^)));
  92.   LastItem := MenuItems;
  93.   while LastItem <> nil do
  94.   begin
  95.     MenuItems := LastItem;
  96.     LastItem := LastItem^.Next;
  97.     Dispose(MenuItems);
  98.   end;
  99. end; { Menu.Done }
  100.  
  101. procedure Menu.AddItem(NewItem : MenuItemPtr);
  102. { Adds a new item to a menu }
  103. begin
  104.   if MenuItems = nil then
  105.   begin
  106.     MenuItems := NewItem;
  107.     LastItem := MenuItems;
  108.   end
  109.   else begin
  110.     LastItem^.Next := NewItem;
  111.     LastItem := LastItem^.Next;
  112.   end;
  113. end; { Menu.AddItem }
  114.  
  115. function Menu.AddItemProc(NewProc : ProcPtr) : Boolean;
  116. { Adds a procedure item to a menu }
  117. var
  118.   NewItem : MenuItemProcPtr;
  119. begin
  120.   NewItem := New(MenuItemProcPtr, Init(NewProc));
  121.   if NewItem <> nil then
  122.   begin
  123.     AddItem(NewItem);
  124.     AddItemProc := True;
  125.   end
  126.   else
  127.     AddItemProc := False;
  128. end; { Menu.AddItemProc }
  129.  
  130. function Menu.AddItemMenu(NewMenu : MenuPtr) : Boolean;
  131. { Adds a new menu item to a menu }
  132. var
  133.   NewItem : MenuItemMenuPtr;
  134. begin
  135.   NewItem := New(MenuItemMenuPtr, Init(NewMenu));
  136.   if NewItem <> nil then
  137.   begin
  138.     AddItem(NewItem);
  139.     AddItemMenu := True;
  140.   end
  141.   else
  142.     AddItemMenu := False;
  143. end; { Menu.AddItemMenu }
  144.  
  145. procedure Menu.RunMenu;
  146. { Run a menu system }
  147. var
  148.   Ch, Counter, P : Word;
  149.   CurrMenu : MenuPtr;
  150.   I : MenuItemPtr;
  151. begin
  152.   CurrMenu := @Self;
  153.   repeat
  154.     with CurrMenu^ do
  155.     begin
  156.       ClrEOLXY(1, Pred(Scr.CurrRows), Colors.MenuLoColor);  { Print the menu }
  157.       for Counter := 1 to Length(MenuString^) do
  158.       begin
  159.         if MenuString^[Counter] in ['A'..'Z'] then
  160.           WriteColor(MenuString^[Counter], Colors.MenuHiColor)
  161.         else
  162.           WriteColor(MenuString^[Counter], Colors.MenuLoColor);
  163.       end;
  164.       repeat
  165.         Ch := GetKeyUpCase;
  166.         case Ch of
  167.           ESC : CurrMenu := Parent;
  168.           Ord(' ')..Ord('~') : begin
  169.             P := Pos(Chr(Lo(Ch)), CommandString^);
  170.             if P <> 0 then              { A menu item has been chosen }
  171.             begin
  172.               I := MenuItems;
  173.               for Counter := 2 to P do
  174.               begin
  175.                 if I <> nil then
  176.                   I := I^.Next;
  177.               end;
  178.               if I <> nil then
  179.               begin
  180.                 I^.RunItem(CurrMenu);   { Run the procedure or switch menus }
  181.                 Ch := ESC;
  182.               end;
  183.             end;
  184.           end;
  185.         end; { case }
  186.       until Ch = ESC;
  187.     end; { with }
  188.   until CurrMenu = nil;
  189.   ClrEOLXY(1, Pred(Scr.CurrRows), Colors.MenuLoColor);
  190. end; { Menu.RunMenu }
  191.  
  192. constructor MenuItem.Init;
  193. { Initializes a menu item }
  194. begin
  195.   Next := nil;
  196. end; { MenuItem.Init }
  197.  
  198. procedure MenuItem.RunItem(var CurrMenu : MenuPtr);
  199. begin
  200.   Abstract('MenuItem.RunItem');
  201. end; { MenuItem.RunItem }
  202.  
  203. constructor MenuItemProc.Init(InitProc : ProcPtr);
  204. { Initializes a procedure menu item }
  205. begin
  206.   MenuItem.Init;
  207.   Proc := InitProc;
  208. end; { MenuItemProc.Init }
  209.  
  210. procedure MenuItemProc.RunItem(var CurrMenu : MenuPtr);
  211. { Runs the procedure that a procedure menu item points to }
  212. begin
  213.   ClrEOLXY(1, Pred(Scr.CurrRows), Colors.MenuLoColor);
  214.   if @Proc <> nil then
  215.     Proc;
  216.   CurrMenu := nil;
  217. end; { MenuItemProc.RunItem }
  218.  
  219. constructor MenuItemMenu.Init(InitMenu : MenuPtr);
  220. { Initializes a new menu menu item }
  221. begin
  222.   MenuItem.Init;
  223.   NewMenu := InitMenu;
  224. end; { MenuItemMenu.Init }
  225.  
  226. procedure MenuItemMenu.RunItem(var CurrMenu : MenuPtr);
  227. { Changes CurrMenu so that the menu that the item points to becomes the new
  228.   current menu }
  229. begin
  230.   CurrMenu := NewMenu;
  231. end; { MenuItemMenu.RunItem }
  232.  
  233. end.
  234.