(495)240-8280ПН-СБ с 12:00 до 20:00
We speak English

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) выдает сам клик мыши. То же самое касается длительных нажатий на клавишу мыши и других типов событий. Пожалуйста, имейте это в виду, когда создаете обработчика мыши/клавиатуры.