Перейти к основному содержимому
Версия: 7.0

Оператор INPUT

Оператор INPUT - создание действия, осуществляющего ввод значения встроенного или пользовательского класса.

Синтаксис

INPUT [MULTI] inputValue
[CHANGE [= changeExpr] [NOCONSTRAINTFILTER] [NOCHANGE]]
[CUSTOM editorFunction]
[LIST listSource]
[WHERE condition]
[ACTIONS contextAction1, ..., contextActionN]
[sessionScope]
[TO propID]
[DO actionOperator [ELSE elseActionOperator]]

Где inputValue — это имя класса или выражение, задающее начальное значение:

[[alias] =] className
[alias] = expr

Для встроенного класса знак = можно опустить (INPUT STRING); для пользовательского класса знак = обязателен (INPUT o = Customer).

Где listSource задаёт значения-кандидаты — в виде свойства или действия, которое их возвращает:

listExpr
listAction

Где каждый contextAction имеет следующий синтаксис:

image [KEYPRESS key] [TOOLBAR [quickAccess1 ... quickAccessN]] action

Описание

Оператор INPUT создаёт действие, которое запрашивает у пользователя значение заданного класса. Для пользовательского класса без явного LIST интерактивный ввод открывает форму выбора объектов этого класса, а программно переданное значение интерпретируется как идентификатор объекта.

Блок LIST ограничивает предлагаемые для выбора значения заданным набором. Набор задаётся либо свойством (listExpr), значения которого предлагаются пользователю, либо действием (listAction), которое формирует их для уже введённого значения (допустимо только для встроенного класса). Блок WHERE дополнительно сужает этот набор заданным условием.

Блок CUSTOM заменяет стандартный редактор ввода пользовательским, отрисовываемым заданной клиентской функцией. Блок ACTIONS добавляет рядом с элементом ввода дополнительные кнопки, каждая из которых по нажатию выполняет своё действие.

Результат ввода записывается в локальный параметр alias и доступен в блоке DO. Его также можно записать в свойство. Блок CHANGE записывает результат в изменяемое свойство: по умолчанию — в то, что указано как начальное значение ввода (или в свойство changeExpr), и по умолчанию ограничивает предлагаемые значения теми, запись которых не нарушит существующих ограничений. Блок TO записывает результат в указанное свойство propID.

Интерактивный ввод значения встроенного класса выполняется в редакторе той ячейки свойства формы, изменение которой обрабатывается, — поэтому созданное оператором действие должно вызываться из обработчика изменения свойства формы (как в примере ниже). При вызове действия вне такого обработчика — например, кнопкой, добавленной на форму, — ввод возможен только для классов, значения которых вводятся через отдельный диалог: файловых классов и COLOR. Запрос остальных встроенных классов там не поддерживается и приводит к ошибке во время выполнения. Чтобы запросить значение другого встроенного класса вне обработчика изменения, используйте оператор DIALOG: откройте форму, объект которой этого класса отображается в панели, пометив объект INPUT, — введенное пользователем значение возвращается при закрытии формы.

Параметры

  • MULTI

    Ключевое слово, при указании которого оператор переходит в режим множественного ввода — пользователь вводит сразу несколько значений, по одному на строку. Добавляется неявный параметр row класса INTEGER (номер строки), доступный в блоке DO, который затем выполняется для каждой введённой строки.

  • className

    Имя класса запрашиваемого значения.

  • expr

    Выражение, класс значения которого определяет класс запрашиваемого значения, а само значение используется как начальное значение ввода.

  • alias

    Имя локального параметра, в который будет записан результат ввода. Простой идентификатор.

  • changeExpr

    Выражение, которое определяет свойство, в которое будет записан результат ввода. По умолчанию, для этого используется свойство, указанное в качестве начального значения ввода.

  • NOCONSTRAINTFILTER

    Ключевое слово, отключающее фильтр на соответствие ограничениям, который CHANGE добавляет по умолчанию.

  • NOCHANGE

    Ключевое слово, отменяющее запись результата в свойство: результат по-прежнему привязывается к alias, но ни одно свойство не изменяется. Используется, чтобы сохранить фильтр ограничений CHANGE без самой записи.

  • editorFunction

    Строковый литерал с именем клиентской функции, которая отрисовывает пользовательский редактор ввода вместо стандартного.

  • listExpr

    Выражение, задающее набор предлагаемых для выбора значений. Для ввода значения встроенного класса задаёт значения-кандидаты, показываемые в списке. Для ввода значения пользовательского класса сопоставляет каждому объекту-кандидату отображаемое значение (например, name(s)); класс значения listExpr определяет встроенный редактор.

  • listAction

    Действие, формирующее значения-кандидаты (выполняется с уже введённым значением). Используется вместо listExpr. Допускается только для ввода значения встроенного класса.

  • condition

    Выражение, которое сужает предлагаемые значения-кандидаты до тех, для которых его значение не равно NULL.

  • image

    Строковый литерал, значение которого определяет иконку кнопки.

  • key

    Строковый литерал, задающий клавишу, нажатие которой активирует кнопку.

  • quickAccess

    Место, где кнопка дополнительно показывается как кнопка быстрого доступа. Задаётся одним из ключевых слов:

    • ALL - на всех строках;
    • SELECTED - на выделенных строках;
    • FOCUSED - на строке в фокусе.

    За ключевым словом может следовать HOVER — тогда кнопка показывается только при наведении мыши. Если не указано ни одного места, список быстрого доступа пуст.

  • action

    Действие, выполняемое при нажатии кнопки.

  • sessionScope

    Сессия, в которой выполняется ввод. Задаётся одним из ключевых слов:

    • NEWSESSION - новая сессия верхнего уровня;
    • NESTEDSESSION - новая вложенная сессия;
    • THISSESSION - текущая сессия. Используется по умолчанию.
  • propID

    Идентификатор свойства без параметров, в которое дополнительно записывается результат ввода.

  • actionOperator

    Контекстно-зависимый оператор-действие, выполняется, если ввод был успешно завершен.

  • elseActionOperator

    Контекстно-зависимый оператор-действие, выполняется, если ввод был отменен. В качестве параметров нельзя использовать параметр результата ввода.

Примеры

changeCustomer (Order o)  {
INPUT s = STRING[100] DO {
customer(o) <- s;
IF s THEN
MESSAGE 'Customer changed to ' + s;
ELSE
MESSAGE 'Customer dropped';
}
}

FORM order
OBJECTS o = Order
PROPERTIES(o) customer ON CHANGE changeCustomer(o)
;

testFile {
INPUT f = FILE DO { // запрашиваем диалог по выбору файла
open(f); // открываем выбранный файл
}
}

sku = DATA Sku (OrderDetail);

// выбор объекта пользовательского класса: предлагаем sku по их наименованию и оставляем только те, что в наличии, и записываем обратно
changeSku (OrderDetail d) {
INPUT s = sku(d) CHANGE LIST name(s) WHERE inStock(s);
}

tagName = DATA STRING[100] (Order, INTEGER);

// множественный ввод: пользователь вводит несколько значений сразу, блок DO выполняется для каждой введённой строки
changeTags (Order o) {
INPUT MULTI s = STRING[100] DO
tagName(o, row) <- s;
}