Попередня
Зміст
Наступна
Тема 18. Рiзнi задачi
Теорія

 

    Задача 18.6.ПРОЕКТУВАННЯ МЕНЮ

    Меню включає перерахування всіх можливостей програми з якого користувач вибирає потрібну на даний момент. В програмах для ПЕОМ оформленню меню з точки зору структури, дизайну приділяється дуже велике значення, так як через нього реалізуються функції і можливості програми. Меню повинно бути простим у роботі і зрозумілим навіть для непідготовленого користувача. Меню буває трьох типів: просте, горизонтальне і вертикальне. Поєднуючи горизонтальне і вертикальне меню можна отримати вкладене меню. У простому меню виводиться список пунктів меню і список клавіш з допомогою яких вибираються пункти меню. У горизонтальних і вертикальних меню користувач вибирає необхідний пункт за допомогою клавіш управління курсором.
    Наведемо модуль MENU у якому реалізовано побудову горизонтального і вертикального меню. У модулі передбачені процедури CF(COLOR, FON:byte); Процедура встановлює колір і фон, задані параметри COLOR i FON. FRAME(x1, y1, x2, y2:integer); Процедура будує вікно, лівий верхній кут якого має координати (x1, y1), а правий - (x2, y2). VMenu(k1, k2, kp:byte;ss1, ss2, ss3, ss4, ss5:string; Var Result:byte, Var ExitFlag:boolean); Процедура будує вертикальне меню. Лівий верхній кут меню виводиться у позицію екрану, задану координатами(К1, К2), а правий нижній залежить від Кр(кількості режимів) і автоматично вираховується. SS1,... , SS5-пункти меню. Процедура повертає у змінний Result вибраний пункт меню. Також повертає значення True або False в залежності від того, яким чином вийшли з меню. Якщо ExitFlag=True, то з меню вийшли натиснувши , якщо EnterFlag=False, то з меню вийшли по . GMenu(Res, Kp;integer;SS1, SS2, SS3, SS4, SS5:string; Var Result:byte); Процедура будує горизонтальне меню, яке розміщене у верхній частині екрану. Виділяється пункт меню, заданий змінною Res. кількість пунктів меню задається змінною Kp, а самі пункти змінними SS1,... SS5. Повертаємо вибраний пункт у змінній Result. Для користувача доступним є дві процедури VMenu і GMenu, які описані в секції Interface, а також константи, які задають колір і фон меню, екрану, вікон, тексту. Горизонтальне і вертикальне меню мають такі особливості: - кількість режимів не більше 5; - горизонтальне меню будується у верхній частині екрану, тоді як вертикальне може будуватися у будь-якій його частині; - якщо кількість пунктів менша 5, то потрібно вказувати в апострофах пусті значення параметрів; - колір і фон меню розраховані для кольорового монітора, легко можуть бути змінені користувачем.

    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.
    
Попередня
Зміст
Наступна