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

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