Оператор DIALOG
Оператор DIALOG создаёт действие, открывающее форму в интерактивном представлении в виде диалога ввода значения.
Синтаксис
DIALOG target
[formActionOptions]
[{initActionOperator}]
[DO actionOperator [ELSE elseActionOperator]]
Где target — одна из двух форм. Именная форма открывает ранее объявленную форму, прикрепляя objSpec к каждому объекту формы:
formName [OBJECTS objName1 objSpec1, ..., objNameN objSpecN]
а классовая форма открывает форму выбора или редактирования класса (указывается ровно одно из LIST или EDIT) с одним неявным объектом, к которому objSpec прикрепляется напрямую:
[LIST] [EDIT] className objSpec
Каждый objSpec:
[= expr [NULL]] [inputHead [alias] [NULL] [TO propId] [CONSTRAINTFILTER [= changeExpr]] [LIST listExpr]]
Где inputHead — одна из двух форм. Форма ввода возвращает выбранное значение:
INPUT
а форма ввода с записью дополнительно записывает его в свойство:
CHANGE [= changeExpr] [NOCONSTRAINTFILTER] [NOCHANGE]
А formActionOptions — произвольная комбинация следующих опций в любом порядке:
FILTERS filterExpr1, ..., filterExprM
windowType
manageSessionType
sessionScopeType
cancelType
READONLY
CHECK
А windowType — одно из:
FLOAT
DOCKED
EMBEDDED
POPUP
IN containerName
Описание
Оператор DIALOG создаёт действие, которое открывает указанную форму для ввода значения: каждый объект, помеченный INPUT или CHANGE, возвращает своё последнее текущее значение в момент закрытия формы. Блок OBJECTS задаёт начальные значения объектам формы (в классовой форме описание объекта прикрепляется напрямую к классу и играет ту же роль для единственного объекта формы, который неявно имеет имя object и служит как alias по умолчанию и как имя параметра внутри выражений FILTERS и DO). Внутри formActionOptions опция FILTERS прикрепляет дополнительные фильтры, вычисляемые из контекста вызова; остальные опции управляют поведением открытия — расположением, сессией, видимостью системных действий и другими модификаторами. Завершающий блок {initActionOperator} выполняется один раз при открытии формы.
Если пользователь закрывает форму через системное действие OK (System.formOk[]), возвращаются выбранные значения объектов; через системное действие Сбросить (System.formDrop[]) — значения NULL. В обоих случаях ввод считается успешно завершённым, и actionOperator запускается с возвращаемыми значениями, связанными с соответствующими параметрами alias. Если пользователь закрывает форму любым другим способом (System.formClose[]), ввод считается отменённым, и вместо этого запускается elseActionOperator.
Оператор работает синхронно (ожидает закрытия формы), если результат ввода используется далее — указано продолжение DO/ELSE или хотя бы у одного объекта стоит CHANGE без NOCHANGE (неявная запись обратно остаётся включённой). Иначе режим синхронизации определяется по контексту вызова (та же эвристика, что и для опции WAIT/NOWAIT оператора SHOW) и всё ещё может оказаться синхронным, например когда диалог открывается из уже модальной формы.
Параметры
-
formNameИмя формы. Составной идентификатор.
-
LIST,EDITКлючевые слова. Определяют, какая именно классовая форма открывается:
LIST— форма выбора,EDIT— форма редактирования. Должно быть указано ровно одно изLISTилиEDIT. -
classNameИмя пользовательского класса, форму выбора или редактирования которого надо открыть. Составной идентификатор.
-
objName1, ..., objNameNИмена объектов формы. Простые идентификаторы.
-
exprВыражение, значение которого используется как начальное значение того объекта формы, к которому прикреплён содержащий его
objSpec. -
NULLпосле начального значенияКлючевое слово. Разрешает передаче начального значения быть
NULL. По умолчанию, если какое-либо передаваемое значение равноNULL, действие пропускается, и управление передаётся следующему действию. Автоматически включается, если для объекта указан маркерINPUT/CHANGE. -
initActionOperatorКонтекстно-зависимый оператор-действие, выполняющийся при открытии формы, после обработчиков
EVENTS ON INITформы. -
actionOperatorКонтекстно-зависимый оператор-действие, выполняющийся после успешного закрытия формы пользователем. Параметры
alias, добавленные пообъектными маркерамиINPUT/CHANGE, видны внутри этого действия. -
elseActionOperatorКонтекстно-зависимый оператор-действие, выполняющийся, если пользователь отменил ввод. Параметры
alias, добавленные пообъектными маркерамиINPUT/CHANGE, не видны внутри этого действия.
Опции ввода
-
INPUTКлючевое слово. Помечает объект как возвращающий последнее текущее значение при закрытии формы. Возвращённое значение связывается с локальным параметром
aliasи становится доступно действиюactionOperatorв блокеDO. -
CHANGEКлючевое слово. Как
INPUT, но дополнительно записывает возвращённое значение обратно в свойство. По умолчанию записываемое свойство — то, что задано как начальное значение (expr); чтобы использовать другое, укажитеchangeExprпослеCHANGE. Также по умолчаниюCHANGEдобавляет к форме фильтр, оставляющий для выбора только те значения объекта, при присваивании которых ни одно из существующих ограничений не нарушится. -
NOCONSTRAINTFILTERКлючевое слово. Отключает фильтр соответствия ограничениям, который
CHANGEдобавляет по умолчанию. -
NOCHANGEКлючевое слово. Подавляет запись обратно; возвращённое значение связывается с
alias, но никакое свойство не обновляется. Используется, чтобы получить поведение фильтра ограничений отCHANGEбез неявного присваивания. -
aliasИмя локального параметра, с которым связывается возвращённое значение. Простой идентификатор. По умолчанию — имя объекта формы.
-
NULLв маркереINPUT/CHANGEКлючевое слово. Разрешает пользователю вернуть
NULLчерез системное действие Сбросить (System.formDrop[]). Включено по умолчанию послеCHANGE, иначе по умолчанию выключено. -
propIdИдентификатор свойства, в которое записывается возвращённое значение (в форме
INPUT), либо в которое значение пишется дополнительно к целиCHANGE. Свойство вызывается без параметров. -
CONSTRAINTFILTERКлючевое слово. Включает фильтр соответствия ограничениям, описанный для
CHANGE. ПослеINPUTфильтр по умолчанию выключен, иCONSTRAINTFILTERего включает. ПослеCHANGEфильтр по умолчанию включён, и это ключевое слово оставляет его включённым — в том числе если был указанNOCONSTRAINTFILTER, в этом случаеCONSTRAINTFILTERснова включает фильтр.changeExprзадаёт свойство, используемое фильтром, и при наличииCHANGEэто же свойство заменяет цельCHANGE(одно и то же свойство используется и для проверки ограничений, и для записи обратно). -
listExprВыражение, вычисляющее свойство, ограничивающее доступные пользователю строки: для выбора остаются только те строки, для которых значение свойства не
NULL. Вычисляется в расширенном контексте ввода, поэтому может ссылаться на параметрыalias, введённыеINPUT/CHANGEна этом и предыдущих объектах. ОпцияLISTможет быть указана не более чем для одного объекта во всём вызове.
Опции
-
filterExpr1, ..., filterExprMНепустой список выражений, задающих дополнительные фильтры, применяемые к форме. Каждое выражение может использовать как параметры контекста вызова, так и собственные объекты формы.
-
windowTypeРасположение формы:
FLOATпоказывает форму как плавающее окно,DOCKED— как закладку в системном окне форм,EMBEDDEDиPOPUP— как встроенные редакторы,INпомещает форму внутрьcontainerName— компонента дизайна, квалифицированного формой (имя формы, за которым следует путь к компоненту внутри дизайна этой формы), который должен быть контейнером. По умолчанию используетсяFLOAT. -
manageSessionTypeПереопределяет, считается ли открываемая форма собственником сессии. Одно из:
MANAGESESSION— принудительно собственникNOMANAGESESSION— принудительно не собственник
По умолчанию форма становится собственником сессии только если на момент открытия у сессии не было другого собственника.
-
sessionScopeTypeСессия, в которой открывается форма. Одно из:
NEWSESSION— новая сессия верхнего уровняNESTEDSESSION— новая вложенная сессияTHISSESSION— текущая сессия (по умолчанию)
-
cancelTypeПереопределяет, отображать ли системное действие Отменить (
System.formCancel[]) на форме. Одно из:CANCEL— принудительно показатьNOCANCEL— принудительно скрыть
По умолчанию оно отображается, если форма является собственником сессии и содержит действия, способные изменить эту сессию.
-
READONLYКлючевое слово. Если указано, форма открывается в режиме только для чтения.
-
CHECKКлючевое слово. Если указано, при нажатии пользователем системного действия OK (
System.formOk[]) платформа сначала валидирует ожидающие применения изменения сессии (выполняет проход apply — ограничения, агрегации, обработчики событий — без фиксации); диалог закрывается только если валидация прошла успешно, иначе остаётся открытым.
Примеры
FORM selectSku
OBJECTS s = Sku
PROPERTIES(s) id
;
testDialog () {
// открыть форму для ввода значения; показать 'On Init' при открытии, отреагировать на выбранное значение при OK
DIALOG selectSku OBJECTS s INPUT {
MESSAGE 'On Init';
} DO {
MESSAGE 'Selected sku : ' + id(s);
}
}
sku = DATA Sku (OrderDetail);
changeSku (OrderDetail d) {
// ввод с записью: выбор sku, в списке для выбора скрыты значения, которые нарушили бы ограничения
DIALOG selectSku OBJECTS s = sku(d) CHANGE;
// эквивалентно предыдущей строке, расписано через INPUT
DIALOG selectSku OBJECTS s = sku(d) INPUT NULL CONSTRAINTFILTER DO {
sku(d) <- s;
}
}
// форма выбора класса Sku вместо именованной формы
selectAnySku () { DIALOG LIST Sku INPUT s DO MESSAGE 'sku selected'; }