Блок событий
Блоки событий инструкции FORM - набор конструкций, управляющих событиями в интерактивном представлении формы.
Синтаксис
[EVENTS] formEventDecl1, ..., formEventDeclN
Где каждый formEventDecli имеет следующий синтаксис:
ON eventType [replaceMode] eventAction
Где eventType — одна из следующих форм:
INIT
OK [eventPhase]
APPLY [eventPhase]
CANCEL
CLOSE
DROP
CHANGE objName
[CHANGE] OBJECT objName
[CHANGE] groupObjectEvent groupObjectName
[CHANGE] FILTERGROUPS filterGroupName
[CHANGE] FILTERS PROPERTY formPropertyName
[CHANGE] PROPERTY [eventPhase] formPropertyName
QUERYOK
QUERYCLOSE
containerEvent componentSelector
SCHEDULE PERIOD intPeriod [FIXED]
Где eventAction — одна из следующих форм:
eventActionId(param1, ..., paramK)
{ eventActionOperator }
Описание
Блок событий позволяет задать обработчики событий формы, которые возникают в результате определенных действий пользователя. В одном блоке можно через запятую указать произвольное количество обработчиков событий. Если для события указывается несколько обработчиков, то они гарантированно будут выполняться в порядке их задания.
Параметры
-
objNameИмя объекта на форме. Простой идентификатор.
-
groupObjectNameИмя группы объектов на форме. Простой идентификатор.
-
filterGroupNameИмя группы фильтров на форме. Простой идентификатор.
-
formPropertyName -
componentSelectorСелектор компонента дизайна.
-
groupObjectEventОдно из
FILTER,ORDER,FILTERS,ORDERS. -
containerEventОдно из
EXPAND,COLLAPSE,TAB. -
eventPhaseОдно из
BEFORE,AFTER. Если опущено вOK/APPLY, обработчик выполняется на самом событии; если опущено вPROPERTY, задаётся единственный обработчик событияCHANGEдля свойства (см.replaceMode). -
intPeriodПериод планировщика в секундах (целочисленный литерал).
-
FIXEDОтсчитывает период до следующего запуска от старта текущего действия, а не от его окончания.
-
replaceModeУправляет тем, замещает ли обработчик ранее заданные обработчики этого события или добавляется к ним.
REPLACEзамещает все ранее заданные для события обработчики;NOREPLACEдобавляет обработчик к ним. Если не указано, по умолчанию используетсяREPLACEдляQUERYOKиQUERYCLOSEиNOREPLACEдля всех остальных событий.replaceModeне применяется к простой форме событияPROPERTY(безBEFORE/AFTER) — она всегда замещает свой единственный обработчик. -
eventActionIdИдентификатор действия, которое будет являться обработчиком события.
-
param1, ..., paramKСписок параметров действия. Каждый параметр задается именем объекта формы. Имя объекта, в свою очередь, задается простым идентификатором.
-
eventActionOperatorКонтекстно-зависимый оператор-действие. В качестве параметров этого оператора можно использовать имена уже объявленных объектов на форме.
Примеры
showImpossibleMessage() { MESSAGE 'It\'s impossible'; };
posted = DATA BOOLEAN (Invoice);
FORM invoice 'Инвойс' // создаем форму по редактированию инвойса
OBJECTS i = Invoice PANEL // создаем объект класса инвойс
// ... задаем остальное поведение формы
EVENTS
// указываем, что при нажатии пользователем OK должно выполняться действия,
// которое выполнит действия по "проведению" данного инвойса
ON OK { posted(i) <- TRUE; },
// по нажатию кнопки formDrop выдаем сообщение, что такого не может быть, так как эта кнопка
// по умолчанию будет показываться только в форме по выбору инвойса, а эта форма по сути
// является формой редактирования инвойса
ON DROP showImpossibleMessage()
;
CLASS Shift;
currentShift = DATA Shift();
CLASS Cashier;
currentCashier = DATA Cashier();
CLASS Receipt;
shift = DATA Shift (Receipt);
cashier = DATA Cashier (Receipt);
FORM POS 'POS' // объявляем форму для продажи товара покупателю в торговом зале
OBJECTS r = Receipt PANEL // добавляем объект, в котором будет храниться текущий чек
// ... объявляем поведение формы
;
createReceipt () {
NEW r = Receipt {
shift(r) <- currentShift();
cashier(r) <- currentCashier();
ACTIVATE POS.r = r;
}
}
// расширяем форму обработчиком ON INIT, чтобы при её открытии createReceipt создавал новый чек
// и сразу делал его текущим объектом на форме
EXTEND FORM POS
EVENTS
// при открытии формы выполняем действие по созданию нового чека, которое заполняет смену,
// кассира и прочую информацию
ON INIT createReceipt()
// применять каждые 60 секунд
ON SCHEDULE PERIOD 60 FIXED apply();
;