home *** CD-ROM | disk | FTP | other *** search
/ Chip 1999 September / Chip_1999-09_cd.bin / internet / Jeremy / tp / downloads / menuq.pas < prev    next >
Pascal/Delphi Source File  |  1999-08-03  |  5KB  |  213 lines

  1. Unit Menuq;
  2. interface
  3.  
  4.  const MEnable=true;
  5.        MDisable=false;
  6.  
  7.  procedure MReadItems(IJmeno: string; IPrikaz: word; IPlatna: boolean;
  8.                       IText: string);
  9.  function OpenMenu(x,y: byte;MName: string): word;
  10.  
  11. implementation
  12.  uses crt,savewind,vstupy;
  13.  
  14.  type MenuItems=array[1..20] of record
  15.                                 jmeno: string;
  16.                                 prikaz: word;
  17.                                 platna: boolean;
  18.                                 text: string;
  19.                                 end;
  20.  
  21.  var
  22.       MNormal,
  23.       MSelect,
  24.       MSelDis,
  25.       MInfo,
  26.       MTitle,
  27.       MFramS: byte;
  28.  
  29.  var
  30.     MItems: MenuItems;
  31.     MCount, MPos, MLast,MWidth: byte;
  32.     Menux, Menuy, MOldx, MOldy: byte;
  33.     OldAttr: byte;
  34.     MPlace: pbuf;
  35.  
  36. procedure MNul;
  37. begin
  38.      MPos:=1;
  39.      MLast:=1;
  40.      oldattr:=textattr;
  41.      textattr:=MNormal;
  42.      MCount:=0;
  43.      MWidth:=0;
  44. end;
  45.  
  46. procedure MFrame(x1,y1,x2,y2: byte);
  47. var I: byte;
  48. begin
  49.      textattr:=MNormal;
  50.      gotoxy(x1-1,y1-1);
  51.      write('┌');
  52.      for I:=x1 to x2 do write('─');
  53.      textattr:=MFramS;
  54.      write('┐');
  55.      textattr:=MNormal;
  56.      for I:=y1 to y2 do
  57.       begin
  58.            gotoxy(x1-1,i);
  59.            write('│');
  60.       end;
  61.      textattr:=MFramS;
  62.      for I:=y1 to y2 do
  63.       begin
  64.            gotoxy(x2+1,i);
  65.            write('│');
  66.       end;
  67.      textattr:=MNormal;
  68.      gotoxy(x1-1,y2+1); write('└');
  69.      textattr:=MFramS;
  70.      for I:=x1 to x2 do write('─');
  71.      write('┘');
  72. end;
  73.  
  74. function InfoLn(S: string): string;
  75. var I: integer;
  76. begin
  77.      for I:=1 to 36-(length(S) div 2) do s:=concat(' ',s,' ');
  78.      Infoln:=s;
  79. end;
  80.  
  81. procedure CloseMenu;
  82. begin
  83.      restorewin(menux-1,menuy-1,menux+MWidth,menuy+MCount,MPlace);
  84.      MNul;
  85. end;
  86.  
  87. procedure MReadItems(IJmeno: string; IPrikaz: word; IPlatna: boolean;
  88.                      IText: string);
  89. begin
  90.      MCount:=MCount+1;
  91.      MItems[MCount].jmeno:=IJmeno;
  92.      MItems[MCount].prikaz:=IPrikaz;
  93.      MItems[MCount].platna:=IPlatna;
  94.      MItems[MCount].text:=IText;
  95. end;
  96.  
  97. procedure MLongItem;
  98. const Q: byte = 0;
  99. var I,J: byte;
  100. begin
  101.      for I:=1 to MCount do
  102.       if Q<(Length(MItems[i].jmeno)) then Q:=Length(MItems[i].jmeno);
  103.  
  104.      MWidth:=Q;
  105.  
  106.      for I:=1 to MCount do
  107.       begin
  108.            for J:=Ord(MItems[i].jmeno[0]) to MWidth-1 do
  109.             MItems[i].jmeno:=MItems[i].jmeno+' ';
  110.       end;
  111. end;
  112.  
  113. function OpenMenu(x,y: byte;MName: string): word;
  114. label 1;
  115. var I: byte;
  116.     key: char;
  117. begin
  118.      menux:=x;
  119.      menuy:=y;
  120.      MPos:=1;
  121.      MLongItem;
  122.      Savewin(menux-1,menuy-1,menux+MWidth,menuy+MCount,MPlace);
  123.      MFrame(menux,menuy,menux+MWidth-1,menuy+MCount-1);
  124.      gotoxy(x+(MWidth div 2)-(Length(MName) div 2)-1,menuy-1);
  125.      textattr:=MTitle;
  126.      write(' ',MName,' ');
  127.      for I:=0 to MCount-1 do
  128.       begin
  129.            gotoxy(menux,menuy+i);
  130.            textattr:=MNormal;
  131.            if i+1 = MPos then
  132.             begin
  133.                  textattr:=MSelect;
  134.                  write(MItems[i+1].jmeno);
  135.                  MOldx:=wherex;
  136.                  MOldy:=wherey;
  137.                  textattr:=MInfo;
  138.                  gotoxy(4,23);
  139.                  write(infoln(MItems[i+1].text));
  140.                  gotoxy(moldx,moldy);
  141.             end
  142.            else
  143.                begin
  144.                     if MItems[i+1].platna=MDisable then textattr:=MInfo;
  145.                     write(MItems[i+1].jmeno);
  146.                end;
  147.       end;
  148. 1:
  149.       repeat
  150.             key:=GetLegalKey([Up, Down, CR]);
  151.             case key of
  152.             Up:
  153.                begin
  154.                     MLast:=Mpos;
  155.                     MPos:=Mpos-1;
  156.                     if MPos=0 then MPos:=MCount;
  157.                end;
  158.             Down:
  159.                  begin
  160.                       MLast:=MPos;
  161.                       MPos:=Mpos+1;
  162.                       if MPos=Mcount+1 then Mpos:=1;
  163.                  end;
  164.             end;
  165.  
  166.       gotoxy(menux,menuy+mLast-1);
  167.       textattr:=MNormal;
  168.       if MItems[MLast].platna=MDisable then textattr:=MInfo;
  169.       write(MItems[MLast].jmeno);
  170.  
  171.       gotoxy(menux,menuy+MPos-1);
  172.       textattr:=MSelect;
  173.       if MItems[MPos].platna=MDisable then textattr:=MSelDis;
  174.       write(MItems[MPos].jmeno);
  175.       moldx:=wherex;
  176.       moldy:=wherey;
  177.       gotoxy(4,23);
  178.       textattr:=MInfo;
  179.       write(infoln(Mitems[Mpos].text));
  180.       gotoxy(moldx,moldy);
  181.  
  182.      until key=CR;
  183.  
  184.      if MItems[MPos].platna=MEnable then
  185.       OpenMenu:=Mitems[Mpos].prikaz
  186.      else goto 1;
  187.  
  188.      CloseMenu;
  189. end;
  190.  
  191. var dosmode: byte absolute $0000:$0449;
  192.  
  193. BEGIN
  194.       if dosmode<>7 then
  195.        begin
  196.       MNormal:=16*lightgray+black;
  197.       MSelect:=16*blue+yellow;
  198.       MSelDis:=16*blue+lightgray;
  199.       MInfo:=16*lightgray+darkgray;
  200.       MFramS:=16*lightgray+white;
  201.       MTitle:=16*lightgray+blue;
  202.        end
  203.       else
  204.        begin
  205.        MNormal:=16*lightgray+black;
  206.        MSelect:=16*black+white;
  207.        MSelDis:=16*black+green;
  208.        MInfo:=16*lightgray+black;
  209.        MFramS:=16*lightgray+black;
  210.        MTitle:=16*lightgray+black;
  211.       end;
  212. END.
  213.