                             EVENTS.
                             -------

 Turbo Vision applications are event-driven.  Events are occurrences to
 which the application must respond.  Traditional Turbo Pascal handling of
 events is achieved by reading some form of input and making decisions based
 on that input.  Turbo Vision deals with these tasks for the programmer.  It
 packages the input into Pascal records called 'events' and dispatches the
 events to the appropriate views in the program.

 A variant record of type TEvent is used (see page 376 of the Turbo Vision
 Guide).  The first field of the record is 'What' and this will be set to a
 word value representing one of four events: evNothing, evMouse, evKeyDown
 or evMessage.  A CASE statement is then used to determine the other fields
 appropriate to the event, with the fields associated with evKeyDown and
 evMessage themselves controlled by other CASE statements.

 Both outside events, such as mouse and keyboard events, and command events
 generated by inter-communicating views are stored and transmitted as TEvent
 records.

 The capture and execution of an event is automatically dealt with by the
 main processing loop of any instance of a type TApplication, the 'Run'
 method, which calls TGroup.Execute (see page 239).  This method repeatedly
 gets events using the 'GetEvent' method and handles them using the
 'HandleEvent' method.  In almost all cases it is the TProgram.GetEvent
 method which is called (page 271), unless this has been overridden.
 HandleEvent methods exist in the object hierarchy from TView through TGroup
 to TWindow, TDeskTop and TProgram.  Although TDeskTop.HandleEvent is seldom
 overridden, the other two frequently are, with TProgram.HandleEvent almost
 always overridden to introduce handling of commands that are specific to
 the user's own application.

 TProgram.GetEvent first checks if TProgram.PutEvent has generated a pending
 event and, if so, GetEvent returns that event.  If there is no pending
 event, GetEvent calls GetMouseEvent (page 345), a standard procedure.  If
 that returns evNothing, it then calls GetKeyEvent (page 344), another
 standard procedure.  If it also returns evNothing, indicating that there is
 no user input, GetEvent calls TProgram.Idle to allow 'background' tasks to
 be performed while the application is waiting for user input.  Before
 returning, GetEvent passes any evKeyDown and evMouseDown events to the
 StatusLine for it to map into associated evCommand hot-key events.

 The various kinds of event were mentioned in the second paragraph above and
 can now be defined in more detail.  A 'nothing' event is really a dead
 event.  When a Turbo Vision object finishes handling an event, it calls a
 method named ClearEvent, which sets the 'What' field back to evNothing,
 indicating that the event has been handled.

 There are four kinds of mouse event: an up or down click of either
 button, generating evMouseUp and evMouseDown respectively; a change of
 position, generating evMouseMove; or an 'auto' mouse event, periodically
 generated by Turbo Vision when the mouse is moved whilst a button is held
 down.

 The keyboard event simply generates evKeyDown and keeps track of which key
 was pressed.

 There are three kind of message events: commands, flagged by evCommand in
 the 'What' field; broadcasts, indicated by evBroadcast; and user messages,
 described by a user-defined constant.

 Events are sent first to the current 'modal' view, which is the view that
 currently defines the mode of operation.  For example, in the integrated
 development environment, there are editing, debugging, compiling and run
 modes.  When an application uses a modal dialog box, the dialog box object
 is the modal view and initiates the event handling.  Subsequently the event
 may be routed in one of three ways: positional, focused and broadcast.

 Positional events are almost always mouse events and are passed first to
 the modal view and then subsequently to the subviews in layer order, top
 downwards, called the Z-order.  This continues until a view is found which
 contains the position where the event occurred.  This continues until
 either there are no more subviews or there is no subview in the position
 where the event occurred.  Once the event has reached the object where the
 positional event took place, that object handles the event.



 EVENTS.WR1
 EVENTS.TXT
 31.3.91
