Оператор 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;
}