4.2. Структуры CASE IF THEN END; END;
Если программа состоит из нескольких ветвей, из которых только одна будет выполнена на основании определенных условий, то нужно использовать ветвь CASE.
Синтаксис кода выглядит так:
CASE
IF expression1 THEN
// код, при котором если "выражение1" (expression1) верно,
// то возобновляется выполнение команды в конце структуры CASE
END;
IF expression2 THEN
// код, при котором если "выражение2" (expression2) верно,
// то возобновляется выполнение команды в конце структуры CASE
END;
// ...
IF expressionN THEN
// код, при котором если "выражениеN" (expressionN) верно,
// то возобновляется выполнение команды в конце структуры CASE
END;
DEFAULT
// код, когда все предыдущие случаи неверны
// ключевое слово DEFAULT используется по желанию, также как любые команды, следующие за ним
END;
Помните, что ветвь CASE ведет себя во многом так же, как кусочная функция, в том смысле, что будет выполнен только один из внедренных условных переходов IF THEN END. С другой стороны, наличие последовательности множества выражений IF THEN END (без использования CASE) приведет к тестированию каждой индивидуальной ветви IF THEN END.
Пример: Основная клавиатура/Обработчик тачскрина. Ниже представлен каркас для основной клавиатуры и обработчика тачскрина с использованием команды WAIT(-1). При передаче -1 в качестве аргумента команда WAIT приостановит выполнение программы и будет ждать ввода данных либо с клавиатуры, либо с тачскирина. Если спустя минуту ввод не был совершен, то выдается значение -1. В противном случае будет выдано либо ключевое число (для нажатия кнопки), либо список для выбора кнопкой "мыши" (для тачскрина).
В силу того, что используются разные типы объектов (целое число и список), выданных этой командой, и того, что несоответствующие типы объектов присутствуют в одной ветви (такой как выражение IF THEN END), появится ошибка выполнения программы, и мы должны тщательно проверить значение(я), выданные командой WAIT. (Обратите внимание на то, что здесь события тачскрина ДОЛЖНЫ быть проверены в первую очередь, и на то, что показана только часть обработчика; соответственно нужно будет добавить необходимые подпрограммы).
EXPORT KMINPUT()
BEGIN
LOCAL run := 1, key;
// изменить run на 0, чтобы выйти из цикла с оператором while
key := WAIT(-1);
CASE
IF TYPE(key) == 6 THEN
// у нас есть события тачскрина
CASE
IF key(1) == 0 THEN kmMouseDown(); END;
IF key(1) == 1 THEN kmMouseUp(); END;
// ... больше событий нажатия на кнопку мыши
IF key(1) == 7 THEN kmMouseLongClick(); END;
kmMouseEvent(); // обработчик по умолчанию
END;
END;
// в этой точке все события касания были обработаны благодаря
// проверке TYPE(key) == 6; так что остались только нажатия на кнопку
// и если произойдет событие касания, то тесты ниже
// никогда не произойдут
IF key == 0 THEN kmDoAppsKey(); END;
// ... больше определений кнопок
IF key == 50 THEN kmDoPlusKey(); END;
kmOtherEvents(); // обработайте все оставшиеся неопределенные кнопки
END;
END;
Замечание: Способ обработки события нажатия на кнопку мыши с помощью команды WAIT(-1) не такой простой, как кажется. То есть, в один клик кнопкой мыши входят целых три отдельных события, поэтому для восприятия клика мышью требуется выполнение последовательности из трех событий для команды WAIT(-1).
Поэтому при клике мышью первый экземпляр команды WAIT(-1) выдает событие самого нажатия, второй экземпляр WAIT(-1) выдает событие поднятия пальца с кнопки мыши, и только третий экземпляр WAIT(-1) выдает сам клик мыши. То же самое касается длительных нажатий на клавишу мыши и других типов событий. Пожалуйста, имейте это в виду, когда создаете обработчика мыши/клавиатуры.