Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2015, 00:23   #1
qoTIuHr
 
Регистрация: 13.07.2015
Сообщений: 6
По умолчанию Меню из процедур. Листать стрелками.

Напишите пожалуйста не большой пример вертикального меню из процедур, которые можно листать стрелками на клавиатуре. То есть даны две или больше процедур, нужно сделать так ,чтобы они были в начальном меню на выбор для выполнения, и их можно было листать, после чего на Enter активировать.
Буду очень рад если сделаете какое-либо объяснение кода в комментариях "{}". Заранее спасибо.
qoTIuHr вне форума Ответить с цитированием
Старый 25.08.2015, 05:04   #2
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Сделал так:

Код:
uses crt;

const Menu: array[0..3] of string=('Exit','Func 1','Func 2','Func 3');
const Arrow: string=' <--';
var CurrChoice:integer;

procedure DrawArrow(n:integer; draw:boolean);
var i:integer;
begin
    gotoxy(Length(Menu[n])+1, n+1);
    if draw then
    begin
        write(Arrow);
        CurrChoice:=n;
    end
    else
    begin
        write(' ':Length(Arrow));
    end;
end;

procedure InitMenu(n:integer);
var i:integer;
begin
    ClrScr;
    cursoroff;
    for i:=0 to High(Menu) do
        writeln(Menu[i]);
    if (n < 0) or (n > High(Menu)) then n:=0;
    DrawArrow(n,true);
end;

procedure DeinitMenu;
begin
    cursoron;
    ClrScr;
end;

procedure Change(n:integer);
begin
    if (n >= 0) and (n <= High(Menu)) then
    begin
        DrawArrow(CurrChoice,false);
        DrawArrow(n,true);
    end;
end;

function ShowMenu(n:integer):integer;
var ch:char;
begin

    InitMenu(n);

    repeat
        ch:=ReadKey;
        if ch = #0 then
        begin
            ch:=ReadKey;
            case ch of
                #80: Change(CurrChoice+1);
                #72: Change(CurrChoice-1);
            end;
        end;
    until ch=#13;

    DeinitMenu;

    result:=CurrChoice;
end;


procedure func1;
begin
    writeln('func1');
    writeln('Press any key');
    readkey;
end;

procedure func2;
begin
    writeln('func2');
    writeln('Press any key');
    readkey;
end;

procedure func3;
begin
    writeln('func3');
    writeln('Press any key');
    readkey;
end;



var n:integer;
begin
    n:=1;
    repeat
        n := ShowMenu(n);
        case n of
            1: func1;
            2: func2;
            3: func3;
        end;
    until n=0;

    writeln('Exit');
    writeln('Press any key');
    readkey;
end.
Думаю, что тут все понятно должно быть. Если все же что-то не ясно, то спрашивайте.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 25.08.2015 в 05:10.
Krasiosoft вне форума Ответить с цитированием
Старый 28.08.2015, 16:08   #3
qoTIuHr
 
Регистрация: 13.07.2015
Сообщений: 6
По умолчанию

Это на TP 7.0?. Выдает ошибку на
Код:
procedure InitMenu(n:integer);
var i:integer;
begin
    ClrScr;
    cursoroff; (!ТУТ!) "Unknow identifier"
    for i:=0 to High(Menu) do
        writeln(Menu[i]);
    if (n < 0) or (n > High(Menu)) then n:=0;
    DrawArrow(n,true);
end;
А нельзя такое сделать на метках Label и goto?. Или так не получится?.

Последний раз редактировалось qoTIuHr; 28.08.2015 в 17:18.
qoTIuHr вне форума Ответить с цитированием
Старый 28.08.2015, 17:09   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Такое подойдет?: http://www.programmersforum.ru/showthread.php?t=45028
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.08.2015, 22:00   #5
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от qoTIuHr Посмотреть сообщение
Это на TP 7.0?. Выдает ошибку на
Код:
cursoroff; (!ТУТ!) "Unknow identifier"
Тогда просто уберите вызов функции cursoroff и cursoron. Но тогда будет показываться курсор в меню выбора.

Я делал это на FreePascal.

А модуль crt в TP 7.0 не содержит функций отключения и включение отображения курсора?

Цитата:
Сообщение от qoTIuHr Посмотреть сообщение
А нельзя такое сделать на метках Label и goto?. Или так не получится?.
Получится, но для чего это нужно, если можно все сделать через процедуры/функции?
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 28.08.2015 в 22:14.
Krasiosoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть ли компонент - аналог listbox позволяющий листать, отображать, работать с 150 тыс. строк? Suny-o Компоненты Delphi 24 15.12.2012 11:32
Перемещение символа стрелками Slash4eveR Помощь студентам 9 18.11.2012 21:20
Управление стрелками N.i.k.o.l.a.y. Помощь студентам 4 13.03.2012 10:15
Управление стрелками Sektr63 Gamedev - cоздание игр: Unity, OpenGL, DirectX 0 07.02.2012 16:33
создать форму, по которой можно листать список назад и вперед мария2507 Microsoft Office Excel 13 14.03.2010 08:12