Помощь - Поиск - Пользователи - Календарь
Полная версия: Меню в Паскале
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
ЧЕРМАК
Помогите сделать графическое меню для двух задач.
volvo
Поиск по слову menu пробовал? Выкладывалось как минимум 2 варианта...
ЧЕРМАК
Я видел их и скачал одну, но у меня задачи сделани при помощи модуля CRT, а меню через Graph и мои задачи не пашут там! У меня не работает функция ''writeln''!
ЧЕРМАК
Цитата(volvo @ 31.01.2007 19:36) *

Поиск по слову menu пробовал? Выкладывалось как минимум 2 варианта...





Вот я немного переделал прогу, но у меня не пашет моя задача!
volvo
Ну, не знаю, что ты скачал, а вот тут, например, лежит меню написанное именно для графического режима:
меню во фрейме
ЧЕРМАК
у меня ошибку выдаёт '' Cannot run a unit '' как её можно исправить?
volvo
Так ты же, наверное, запускал ты программу? А нельзя - это модуль... Его надо подключать к программе (через Uses), потом в своей программе заполнять поля переменной N нужными тебе значениями (цвета выбранного/невыбранного элементов, количество кнопок, надписи на кнопках, ... там все написано), и вызывать функцию SimpleMenu, например:

uses FMenu;
var selected: byte;
begin
  { тут инициализация графики и заполнение структуры N }
  ...
  selected := SimpleMenu; { <--- Вот так вот ... }
  ...

ЧЕРМАК
Там не понятно что на что менять! Если ты знаешь что на что менять, поменяй пожалуйста! ОЧЕНЬ нужно.
volvo
Вот я немного подкорректировал модуль (так он более читаемый):
Unit FMenu;

Interface

Type
  TMenu = record
    nOptions: byte;
    Option: array[1 .. 8] of string[22];
    clrActive, clrInActive: integer;
    Title: string[10];
  end;

Var
  menu: TMenu;

Function SimpleMenu: byte;

Implementation
Uses Graph, crt;

Function SimpleMenu : byte;
Var
  i: integer;
  ch: char;
  current: 1 .. 8;
begin
  setfillstyle(solidfill, darkgray);
  current := 1;

  settextstyle(4, 0, 2);
  setcolor(menu.clrActive);
  bar(0, 0, getmaxx, getmaxy);
  settextjustify(centertext, centertext);
  outtextxy(getmaxx div 2, (textheight(menu.Title) + 4) div 2, menu.Title);

  repeat
    for i := 1 to menu.nOptions do begin
      If i = current then setcolor(menu.clrActive)
      else setcolor(menu.clrInActive);
      outtextxy(getmaxx div 2, i*(textheight(menu.Option[i]) + 5) + 60,
                menu.Option[i]);
    end;

    ch := Readkey;
    case ch of
      #0:
        case readkey of
          #72: If current <> 1 then dec(current)
               else current := menu.nOptions;
          #80: If current <> menu.nOptions
               then inc(current) else current := 1;
        end;
    end;

  until ch = #13;
  SimpleMenu := current;
end;

End.


А вот так его вызывать:
uses Graph, FMenu;

var
  grDriver, grMode, ErrCode: integer;
  b: byte;
begin
  grDriver := Detect;
  InitGraph(grDriver, grMode,'');
  ErrCode := GraphResult;
  if ErrCode <> grOk then begin
    Writeln('Graphics error:', GraphErrorMsg(ErrCode));
    readln; halt(100);
  end;

  { Заполняешь структуру }
  with menu do begin
    nOptions := 3;
    Option[1] := 'first';
    Option[2] := 'second';
    Option[3] := 'third';
    Title := 'menu #1';
    clrActive := red; clrInactive := white;
  end;
  { И вызываешь меню... }
  b := SimpleMenu; { <--- В переменной b - номер выбранного элемента }

  { Если понадобится еще одно меню в программе -
     еще раз перезаполни запись menu и вызывай SimpleMenu }
  Readln;
  CloseGraph;
end.



А вообще, я скоро выложу в FAQ и текстовую и графическую версии меню... yes2.gif
mamont001
Цитата(volvo @ 31.01.2007 20:47) *

А вообще, я скоро выложу в FAQ и текстовую и графическую версии меню... yes2.gif


good.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.