![]() ![]() ![]() ![]() |
|||
Наступна
|
|||
Тема
18. Рiзнi задачi
|
|||
Задача 18.6.ПРОЕКТУВАННЯ МЕНЮ Меню включає перерахування всіх можливостей програми з якого користувач
вибирає потрібну на даний момент. В програмах для ПЕОМ оформленню
меню з точки зору структури, дизайну приділяється дуже велике значення,
так як через нього реалізуються функції і можливості програми. Меню
повинно бути простим у роботі і зрозумілим навіть для непідготовленого
користувача. Меню буває трьох типів: просте, горизонтальне і вертикальне.
Поєднуючи горизонтальне і вертикальне меню можна отримати вкладене
меню. У простому меню виводиться список пунктів меню і список клавіш
з допомогою яких вибираються пункти меню. У горизонтальних і вертикальних
меню користувач вибирає необхідний пункт за допомогою клавіш управління
курсором. Unit Menu; INTERFACE Uses Crt; Const ColorScreen:byte=0;{LightCyan; { фон екрану } ColorCursor:byte=Green; { колiр курсора } ColorFrame:byte=Black; { колiр рамки } ColorMenu:byte=LightGray; { фон меню } ColorText:byte=Red; {колiр символiв} Procedure VMenu(K1,K2,Kp:byte; SS1,SS2,SS3,SS4,SS5:string; Var Result:byte;Var ExitFlag:boolean); Procedure GMenu(Res,Kp:integer; SS1,SS2,SS3,SS4,SS5:string; Var Result:byte); IMPLEMENTATION Procedure CF(Color,Fon:byte); Begin TextColor(Color);TextBackGround(Fon);End; Procedure Frame(X1, Y1, X2, Y2:integer); Var i:integer; Begin Window(X1,Y1,X2,Y2); ClrScr; Window(1,1,80,25); if (Y1>1) and (Y1<24) then begin For i:=(x1+1) to (x2-1) do begin GotoXY(i,Y1); Write('Д-'); GotoXY(i,Y2); Write('Д') end; For i:=(Y1) TO(Y2) do begin GotoXY(X1,i); Write('і'); GotoXY(X2,i); Write('і') end; GotoXY(X1,Y1); Write('Ъ'); GotoXY(X2,Y1); Write('ї'); GotoXY(X1,Y2); Write('А'); GotoXY(X2,Y2); Write('Щ'); end; End; Procedure VMenu; Var M:array[1..5] of string; i,Max:byte; Key:char; Fl:Boolean; Begin FL:=True; ExitFLag:=True; Max:=Length(M[1]); M[1]:=SS1; M[2]:=SS2; M[3]:=SS3; M[4]:=SS4; M[5]:=SS5; for i:=2 to Kp do if Length(M[i])>Max then Max:=Length(M[i]); CF(ColorFrame,ColorMenu); Frame(K1-1,K2,K1+Max,K2+Kp+1); For i:=1 to Kp do Begin if i=1 then CF(ColorText,ColorCursor) else CF(ColorText,ColorMenu); GotoXY(K1,K2+i); WriteLn(m[i]); end; i:=1; While FL=True do begin Key:=ReadKey; if (Key=#27) then begin FL:=False; ExitFLag:=False; Window(K1-1,K2,K1+Max,K2+Kp+1); CF(ColorText, ColorScreen); Clrscr; Cf(ColorText, ColorMenu); Window(1,1,80,25) end; if Key=#13 then begin FL:=False; Window(K1-1,K2,K1+Max,K2+Kp+1); CF(ColorText, ColorScreen); Clrscr; CF(ColorText, ColorMenu); Window(1,1,80,25) end; if (Key=#0) and KeyPressed then begin Key:=ReadKey; if (Key=#77) or (Key=#75) then begin FL:=False; ExitFLag:=False; Window(K1-1,K2,K1+Max,K2+Kp+1); CF(ColorText, ColorScreen); Clrscr; Cf(ColorText, ColorMenu); Window(1,1,80,25) end; Case Key of #80: Begin GotoXY(K1,K2+i); CF(ColorText,ColorMenu); Write(M[1]); i:=i+1; if i=Kp+1 then i:=1; CF(ColorText, ColorCursor); GotoXY(K1,K2+i); Write(M[i]); End; #72:Begin GotoXY(k1,k2+i); CF(ColorText,ColorMenu); Write(M[i]);i:=i-1; if i=0 then i:=Kp; CF(ColorText, ColorCursor); GotoXY(K1,K2+i); Write(M[i]); End; end;{case} end; {if} end; {while} Result:=i; END; Procedure GMenu; Var M:array[1..5] of string; i,r,K1:byte; Key:char; Fl:boolean; Begin Fl:=True; M[1]:=SS1; M[2]:=SS2; M[3]:=SS3; M[4]:=SS4; M[5]:=SS5; K1:=2; CF(ColorFrame, ColorMenu); Frame(1,1,80,1);{Рядок меню} Frame(1,24,80,24);{Рядок статусу} GotoXY(70,24);Write('F10 - меню'); For i:=1 to Kp do begin if i=Res then CF(ColorText, ColorCursor) else CF(ColorText, ColorMenu); GotoXY(K1,1); Write(M[i]); K1:=K1+Length(M[i]); end; i:=Res;r:=K1-Length(M[Kp]); K1:=1; For i:=2 to Res do K1:=K1+Length(M[i-1]); While Fl=True do begin Key:=ReadKey; if Key=#13 then Fl:=False; if (Key=#0) and KeyPressed then begin Key:=ReadKey; Case Key of #77: Begin GotoXY(K1,1); CF(ColorText, ColorMenu); Write(M[i]); K1:=K1+Length(M[i]); i:=i+1; if i=Kp+1 then begin i:=1; K1:=2 end; GotoXY(K1,1); CF(ColorText, ColorCursor); Write(M[i]); End; #75: Begin GotoXY(K1,1); CF(ColorText, ColorMenu); Write(M[i]); i:=i-1; K1:=K1-Length(M[i]); if i=0 then begin i:=Kp; K1:=r End; GotoXY(K1,1); CF(ColorText, ColorCursor); Write(M[i]); End; end;{case} end ;{if} end; {while} Result:=i; End; Begin End. Покажемо використання модуля Menu на прикладах роботи з файлами. Для цього потрібно програми Info_stud і Out_stud перетворити на процедури , замінивши слово program на procedure і end. на end;. Потім для зручності створюємо модуль stud, інтерфейсна і реалізаційна частина якого складається з процедур info_stud і out_stud. Після цього будуємо меню , яке складається з горизонтального і вертикального меню, і має структуру: 1. Робота. а)створити файл; б)вивести результати; 2. Вихід. Горизонтальне меню має пункти "Робота" і "Вихід". При виборі пункту "Робота" з'являється вертикальне меню з пунктами "Створити файл" і "Вивести результати". Можна вибрати один з цих пунктів, натиснувши "enter" або вийти з вертикального меню, натиснувши "ESC". Вихід з програми здійснюється вибором пункту "Вихід" у горизонтальному меню. Program Demo_Menu; Uses Menu,{ Stud,} Crt; Label Mitka; Var Regime,Res:byte;Flag:boolean; Begin TextBackGround(ColorScreen); Clrscr; Res:=1; Mitka: GMenu(Res,2,' Робота ',' Вихiд ','','','', Res); Case Res of 1: begin VMenu(2,2,2,'Створити файл ' ,'Вивестирезультати', '','','',Regime, Flag); Window(1,1,80,25); TextBackGround(ColorScreen); ClrScr; Case Regime of 1: if Flag=True then {Info_Stud}; 2:if Flag=True then begin {Out_Stud}end; end; ClrScr; end; 2:Exit end;{case} goto Mitka; End. |
|||
Наступна
|
|||