Unit Menu; INTERFACE Uses Crt,Graph,Graph2; Const MaxSzam = 30; Type TMenuPont = Record Cimke : String; {Menupont kiirando cimkeje} AktivE : Boolean; {Az adott menupont aktiv allapotban van-e} Kezd,Veg : Word; end{record}; TMenuSor = Object X1,Y1 : Integer; {Menu bal also sarkanak koordinatai} Irany : Boolean; {Menupontok elhelyezkedese: 0:sorfolytonos, 1:oszlopfolytonos} AktivMRajzSzin : Word; {Menu rajzolasi szine, ha kivalaszthato a menupont} PasszMRajzSzin : Word; {Menu rajzolasi szine, ha nem kivalaszthato a menupont} AktualHSzin : Word; {Aktualis menupont hatterszine} NotAktualHSzin : Word; {Nem aktualis menupont hatterszine} MenuKoz : Word; {Menupontok oszlopai vagy sorai kozotti tavolsag} HatarSavSzel : Word; Constructor Konstruktor; Procedure AddMenuPont(MenuPont:TMenuPont); Function MenuRajz:Boolean; Function MenuReakcio(Bill:char;var MenuPont:Byte):Boolean; Private MenuPontok : Array[1..MaxSzam] of TMenuPont; {Menupontok adatai} MenuPontSzam : Byte; {Menupontok szama} AktMenuPont : Byte; {Aktualis menu sorszama} MenuMag : Word; MenuSzel : Word; Sreen : Pointer; {ide menti a menu mogotti kepernyot} Procedure ScreenSave; Procedure ScreenLoad; end{Object}; IMPLEMENTATION Constructor TMenuSor.Konstruktor; begin AktMenuPont:=0; MenuPontSzam:=0; end{Konstruktor}; Procedure TMenuSor.ScreenSave; begin end{ScreenSave}; Procedure TMenuSor.ScreenLoad; begin end{ScreenLoad}; Function TMenuSor.MenuRajz:Boolean; Function MaxKiv:Byte; var i : Byte; Sv : Byte; begin Sv:=1; for i:=2 to MenuPontSzam do If TextWidth(MenuPontok[i].Cimke)>TextWidth(MenuPontok[Sv].Cimke) Then Sv:=i; MaxKiv:=Sv; end{MaxKiv}; var I : Byte; FillInfo : FillSettingsType; X : Word; begin GetFillSettings(FillInfo); {kitoltesi minta es szin elmentese} If Irany {oszlopfolytonos} Then begin MenuMag:=TextHeight('S')+(2*HatarSavSzel); {} MenuSzel:=0; For i:=1 to MenuPontSzam do MenuSzel:=MenuSzel+TextWidth(MenuPontok[i].Cimke); If (MenuMag>GetMaxY) or (MenuSzel>GetMaxX) Then begin MenuRajz:=false; Halt; end{then}; MenuSzel:=MenuSzel+((MenuPontSzam+1)*MenuKoz); {kozok az elejere, vegere, es mindegyik koze} SetViewPort2(X1,Y1,X1+MenuSzel,Y1+MenuMag,True); SetFillStyle(1,NotAktualHSzin); {kovetkezo kitoltesi minta betoltese} ClearViewPort2; X:=MenuKoz; For i:=1 to MenuPontSzam do begin If MenuPontok[i].AktivE Then {menu rajzolasi szinenek beallitasa} SetColor(AktivMRajzSzin) Else SetColor(PasszMRajzSzin); OutTextXY2(X,HatarSavSzel,MenuPontok[i].Cimke); MenuPontok[i].Kezd:=X; MenuPontok[i].Veg:=X+TextWidth(MenuPontok[i].Cimke); X:=X+TextWidth(MenuPontok[i].Cimke)+MenuKoz; end{for} end{then} Else {sorfolytonos} begin MenuMag:=0; For i:=1 to MenuPontSzam do MenuMag:=MenuMag+TextHeight(MenuPontok[i].Cimke); MenuMag:=MenuMag+((MenuPontSzam+1)*MenuKoz) {kozok az elejere, vegere, es mindegyik koze}; MenuSzel:=TextWidth(MenuPontok[MaxKiv].Cimke)+(2*MenuKoz); end{else}; SetFillStyle(FillInfo.Pattern,FillInfo.Color);{elozo kitoltesi minta visszaallitasa} MenuRajz:=True; end{MenuRajz}; Procedure TMenuSor.AddMenuPont(MenuPont:TMenuPont); begin Inc(AktMenuPont); MenuPontok[AktMenuPont]:=MenuPont; Inc(MenuPontSzam); end{MenuRajz}; Function TMenuSor.MenuReakcio(Bill:char;var MenuPont:Byte):Boolean; var FillInfo : FillSettingsType; FelKoz : Word; ElozoMenuPont : Byte; KeresMenuPont : Byte; begin GetFillSettings(FillInfo); {kitoltesi minta es szin elmentese} SetViewPort2(X1,Y1,X1+MenuSzel,Y1+MenuMag,True); AktMenuPont:=MenuPont; ElozoMenuPont:=AktMenuPont; MenuReakcio:=False; If Irany {oszlopfolytonos} Then begin FelKoz:=MenuKoz Div 2; ElozoMenuPont:=AktMenuPont; Case Bill of chr(13) : begin MenuReakcio:=True; end{chr(13)}; chr(75) : begin If AktMenuPont>1 Then KeresMenuPont:=AktMenuPont-1 Else KeresMenuPont:=MenuPontSzam; While (AktMenuPont<>KeresMenuPont) and (MenuPontok[KeresMenuPont].AktivE=false) do begin If KeresMenuPont>1 Then Dec(KeresMenuPont) Else KeresMenuPont:=MenuPontSzam; end{while}; AktMenuPont:=KeresMenuPont; end{chr(75)}; chr(77) : begin If AktMenuPontKeresMenuPont) and (MenuPontok[KeresMenuPont].AktivE=false) do begin If KeresMenuPont