OpenInsight 10 and QuickEvent Processing
Published 09 FEB 2020 at 03:15:22PM
OpenInsight 10 introduced a couple of changes to how QuickEvents are processed that you may or may not be aware of, so in this post we'll take a look at them so you can see how they work.
1) QuickEvent arguments are now passed by reference
In previous versions of OpenInsight, arguments passed to QuickEvents were duplicated and passed as copies, which meant that if you altered them in your Commuter Module you wouldn't see the changes in the calling routine. As QuickEvents are normally the last item processed in the event chain this is not something you might actually notice, unless perhaps you were using the Forward_Event() procedure from an Event Script.
Event arguments in version 10 are now passed by reference, which means a calling routine will see any changes you make to them. This is an important point to bear in mind now that it's possible to alter the order in which QuickEvents are executed in the event chain (see the "Has Priority" flag section below), so be careful when using those arguments in your Commuter Modules.
2) The new "Has Priority" flag
Under normal circumstances QuickEvents are always the last handlers processed in the event chain which normally looks something like this:
- Control-specific Event Script
- Promoted Events
- "System" Promoted Events
- QuickEvent
For most purposes this works fine, but there are occasions when you might need to step in front of the system code to do some pre-processing on events such as READ and WRITE, and unfortunately this usually involves writing an Event Script (or a Promoted Event perhaps) to contain your pre-system code like so:
E.g. Sample pre-WRITE Event Script
Function WRITE( CtrlEntID, CtrlClassID ) $Insert Logical WriteOK = TRUE$ // Check if we can save the record - if not then WriteOK will be // Set to FALSE$ which will stop the event chain GoSub CheckOKToWrite Return WriteOK
However, this removes one of the main advantages of using Commuter Modules in the first place: i.e. the ability to keep all of your code in one place. To alleviate this you could just place your pre-WRITE code in your Commuter Module and call it directly :
Function WRITE( CtrlEntID, CtrlClassID ) $Insert Logical // (Assume Commuter Module ID is the same name as the form with an // "_EVENTS" suffix) CommID = @window[1,"*"] : "_EVENTS" WriteOK = Function( @CommID( CtrlEntID, "PREWRITE" ) ) Return WriteOK
But then you're still having to create the Event Script, so you still have a fragment that you need to track.
With version 10 we added a new flag to the QuickEvent handler called "Has Priority":
[caption id="attachment_3053" align="aligncenter" width="350"] "Has Priority" QuickEvent[/caption]
If you set this to True the event chain is changed to this instead:
- Control-specific Event Script
- QuickEvent
- Promoted Events
- "System" Promoted Events
Which means that you can place something like a WRITE event handler in the Commuter Module, do your pre-processing, and return TRUE$ to allow the system to continue the chain, or use Forward_Event() if you need to do some post processing as well.
Points to note:
- If you call Set_EventStatus( TRUE$ ) in your Commuter Module QuickEvent handler the event chain is stopped.
- If you return FALSE$ ("0") from your Commuter Module QuickEvent handler (and it has to be "0", not null) the event chain is stopped.
Hopefully this removes the need for Event Scripts for writing pre-system events and should help to keep your applications a little more streamlined and organized, and preserve the benefits of using Commuter Modules.
Comments
At 09 FEB 2020 04:21PM David Tod Sigafoos wrote:
Thanks Captain .. this works really well