Unit MENU; Interface Type PItem=^TItem; TItem=record Key:string; Code:word; Active:boolean; x,y:integer; l:integer; Next:PItem; {Указатели на след. и пред. пункт} Prev:PItem; end; PMenu=^TMenu; TMenu=record Head:PItem; {1 punkt} x,y:integer; {coordinates} lmax:integer; col1,col2:integer;{color, background - active} end; var CurrMenu:PMenu; gd,gm:integer; {create empty menu} function Init(x1,y1,c1,c2,len:integer):PMenu; procedure Add(Key1:string;Code1:word;P:PMenu); procedure Show(P:PMenu); function Choose(P:PMenu):word; {procedure release(P:PMenu);} Implementation Uses crt,Graph; {function Init(x1,y1,c1,c2,len:integer):PMenu; procedure Add(Key1:string;Code1:word;P:PMenu); procedure Show(P:PMenu); function Choose(P:PMenu):word; {procedure release(P:PMenu);} procedure ShowItem(var PShow:PItem;P:PMenu); begin if Pshow^.Active=true then begin TextBackGround(P^.col2); TextColor(P^.col1); end else begin TextColor(15); TextBackGround(0); end; GotoXY(Pshow^.x,Pshow^.y); write(Pshow^.key); end; function Init{:PMenu}; var P:PMenu; begin P:=New(PMenu); with P^ do begin Head:=nil; x:=x1; y:=y1; col1:=c1; col2:=c2; lmax:=len; end; Init:=P; end; procedure Add; var PNew:PItem; begin New(PNew); with PNew^ do begin Key:=Key1; Code:=Code1; Active:=false; x:=P^.x; y:=P^.y; y:=P^.y+20; l:=P^.lmax; end; with P^ do begin if Head=nil then begin Head:=PNew; PNew^.Active:=true; PNew^.Next:=Head; PNew^.Prev:=Head; end else begin Head^.Prev^.Next:=PNew; PNew^.Prev:=Head^.Prev; Head^.Prev:=PNew; PNew^.Next:=Head; end; end;{with} end; procedure Show; var Curr:PItem; begin {list is not empty!} Curr:=P^.Head; repeat {!} ShowItem(Curr,P); {^ draws element} Curr:=Curr^.Next; until Curr=P^.Head; end; {Choose function} function Choose; var act:PItem;{active element} Curr:PItem;{current element} OK:boolean;{end?} ch:char;{reading char of the button} begin {заполнить ссылку на активный элемент} Curr:=P^.Head; while not (Curr^.Active) do Curr:=Curr^.Next; {end while} act:=Curr; {active founded!} OK:=false; repeat ch:=ReadKey; if Ord(ch)=13 {Enter} then OK:=true else if Ord(ch)=0 then begin ch:=ReadKey; Case ch of {Down} #80:begin act^.Active:=false; ShowItem(act,P); act:=act^.Next; act^.Active:=true; ShowItem(act,P); end; {Up} #72: begin act^.Active:=false; ShowItem(act,P); act:=act^.Prev; act^.Active:=true; ShowItem(act,P); end; end;{case} end;{if} Until OK; Choose:=Act^.Code; end; {choose} {begin} end.