Skip to main content
Version: 4.x

Event block

The event block of the FORM statement - a set of constructions controlling events in an interactive form view.


EVENTS formEventDecl1, ..., formEventDeclN

Where each formEventDecli has the following syntax:

ON eventType eventActionId(param1, ..., paramK) | { eventActionOperator }


The event block allows to define handlers for form events that occur as the result of certain user actions. Each block can have an arbitrary number of comma-separated event handlers. If several handlers are defined for an event, they are guaranteed to be executed in the order they are defined.


  • eventType

    Type of form event. It is specified with one of the following keywords:

    • INIT
    • OK
    • OK AFTER
    • APPLY
    • CANCEL
    • CLOSE
    • DROP
    • CHANGE objName – specifies that the action will be executed when the object objName is changed.
  • eventActionId

    The ID of the action, that will be the event handler.

  • param1, ..., paramK

    List of action parameters. Each parameter is specified with the object name on the form. The object name, in turn, is specified with a simple ID.

  • actionOperator

    Context-dependent action operator. You can use the names of already declared objects on the form as parameters.


showImpossibleMessage()  { MESSAGE 'It\'s impossible'; };

posted = DATA BOOLEAN (Invoice);

FORM invoice 'Invoice' // creating a form for editing an invoice
OBJECTS i = Invoice PANEL // creating an object of the invoice class

// ... setting the rest of the form behavior

// specifying that when the user clicks OK, an action should be executed
// that will execute actions to "conduction" this invoice
ON OK { posted(i) <- TRUE; },

// by clicking the formDrop button, showing a message that this cannot be,
// since this button by default will be shown only in the form for choosing an invoice,
// and this form is basically an invoice edit form
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' // declaring the form for product sale to the customer in the salesroom

OBJECTS r = Receipt PANEL // adding an object that will store the current receipt

// ... declaring the behavior of the form

createReceipt () {
NEW r = Receipt {
shift(r) <- currentShift();
cashier(r) <- currentCashier();

SEEK POS.r = r;

// adding a property through the form extension so that SEEK could be applied to the already created
// object on the form
// when opening the form, executing the action to create a new receipt,
// which fills in the shift, cashier and other information
ON INIT createReceipt()