Guest User

PasMenu

a guest
Mar 25th, 2012
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 2.24 KB | None | 0 0
  1. {$MODE OBJFPC}
  2. unit PasMenu;
  3.  
  4. interface
  5.  
  6. type
  7.   TMenuAction = procedure;
  8.   TTitleRenderer = procedure(t: string);
  9.   TItemRenderer  = procedure(t: string; i: integer);
  10.   TMenuEntry = record
  11.     title: string;
  12.     proc:  TMenuAction;
  13.   end;
  14.   TMenu = record
  15.     title: string;
  16.     items: array of TMenuEntry;
  17.     internal: record
  18.       TitleRenderer: TTitleRenderer;
  19.       ItemRenderer:  TItemRenderer;
  20.     end;
  21.   end;
  22.  
  23. procedure MenuSetup(var menu: TMenu; title: string);
  24. procedure MenuRender(var m: TMenu);
  25. procedure MenuChoose(var m: TMenu);
  26. procedure MenuAddItem(var m: TMenu; title: string; action: TMenuAction);
  27. procedure MenuSetTitleRenderer(var m: TMenu; renderer: TTitleRenderer);
  28. procedure MenuSetItemRenderer(var m: TMenu; renderer: TItemRenderer);
  29.  
  30. implementation
  31.  
  32. procedure MenuRenderTitle(title: string);
  33. begin
  34.   WriteLn(title);
  35. end;
  36.  
  37. procedure MenuChoose(var m: TMenu);
  38. var
  39.   s: string;
  40.   e, i: integer;
  41. begin
  42.   repeat
  43.     write('> ');
  44.     readln(s);
  45.     val(s, i, e);
  46.   until (e <= 0) and (i >= 0);
  47.   if (i <> 0) then
  48.     m.items[pred(i)].proc();
  49. end;
  50.  
  51. procedure MenuAddItem(var m: TMenu; title: string; action: TMenuAction);
  52. begin
  53.   setlength(m.items, succ(length(m.items)));
  54.   m.items[pred(length(m.items))].title := title;
  55.   m.items[pred(length(m.items))].proc  := action;
  56. end;
  57.  
  58. procedure MenuRenderItem(title: string; number: integer);
  59. begin
  60.   WriteLn(number, '. ', title);
  61. end;
  62.  
  63. procedure MenuRender(var m: TMenu);
  64. var
  65.   i: integer;
  66. begin
  67.   m.internal.TitleRenderer(m.title);
  68.   for i := 0 to pred(length(m.items)) do
  69.     m.internal.ItemRenderer(m.items[i].title, succ(i));
  70. end;
  71.  
  72. procedure MenuSetup(var menu: TMenu; title: string);
  73. begin
  74.   menu.title := title;
  75.   menu.internal.TitleRenderer := @MenuRenderTitle;
  76.   menu.internal.ItemRenderer  := @MenuRenderItem;
  77. end;
  78.  
  79. procedure MenuSetTitleRenderer(var m: TMenu; renderer: TTitleRenderer);
  80. begin
  81.   if renderer = nil then
  82.     m.internal.TitleRenderer := @MenuRenderTitle
  83.   else
  84.     m.internal.TitleRenderer := renderer;
  85. end;
  86.  
  87. procedure MenuSetItemRenderer(var m: TMenu; renderer: TItemRenderer);
  88. begin
  89.   if renderer = nil then
  90.     m.internal.ItemRenderer := @MenuRenderItem
  91.   else
  92.     m.internal.ItemRenderer := renderer;
  93. end;
  94.  
  95. end.
Advertisement
Add Comment
Please, Sign In to add comment