{{tag>category:"presentation server" }}
====== Tracking the SAVEWARN property ======
=== Published 18 JUL 2019 at 02:51:32PM ===
As veteran OpenInsight programmers know, the system uses a simple boolean flag (exposed as the **SAVEWARN** property) to determine if the contents of a data-bound form have changed. This flag can be updated in several ways, the most common being:
* From the **LOSTFOCUS** event of a control.
* From the **POSCHANGED**, **INSERTROW** and **DELETEROW** events of an EDITTABLE control.
* From setting a control's **DEFPROP** property.
* From the **CLOSE** event of a form when the control with focus is inspected to see if it has changed.
It is checked during the **CLEAR** and **CLOSE** events to see if it has been set and an "Unsaved Changes" warning issued to the user if so. Most of the time this system works quite well, but (as anyone who has spent several years working with OI systems knows) sometimes it gets triggered when you least expect it, and you're left with no clue as to why.
To help with this situation the next version of OpenInsight introduces **SAVEWARN** tracking, so you can see which parts of the system update the **SAVEWARN** property and when they actually do it. In previous versions the system updated the **SAVEWARN** flag directly (it's a simple variable in the "window common area") but this has been changed to use the Set_Property function so it can be monitored effectively from a single point.
To track **SAVEWARN** you have two choices:
* Use the **SYSMSG** event
* Use the System Monitor
==== Using the SYSMSG event to track SAVEWARN ====
Every time **SAVEWARN** is set a standard **SYSMSG** event is raised with a //SAVEWARNINFO// code; the system itself does nothing with this message, but it's there for you to use if you wish. This option is probably more suited for run-time tracing as it's something you could add to your applications easily if you needed to.
The PS_EQUATES insert record defines the //SAVEWARNINFO// message number that you can intercept:
equ SYSMSG_SAVEWARNINFO$ to 21 ; // Save warn has been changed - null msg
The //Auxiliary// parameter passed to the **SYSMSG** event contains information that describes why the **SAVEWARN** property was changed.
==== Using the System Monitor to track SAVEWARN ====
The SetDebugger() function has been updated to support a new method called //"SAVEWARN"// that enables **SAVEWARN** tracking so that changes are displayed in the System Monitor. This option is probably more suited to development use rather than run-time.
From the System Monitor execute:
setdebugger savewarn 1
to turn on tracing, and:
setdebugger savewarn 0
to turn it off.
E.g:
[caption id="attachment_2876" align="aligncenter" width="625"][[http://revdevx.com/2019/07/18/tracking-the-savewarn-property/sysmon-savewarn/|{{18827.6191203704_1.png}}]] SAVEWARN tracing in the System Monitor[/caption]
==== Setting the SAVEWARN property ====
If you wish to set **SAVEWARN** yourself you may use the "index" parameter to pass a description for the change, so this can be picked up in any tracing scenario like so:
Call Set_Property_Only( @Window, "SAVEWARN", TRUE$, "From My Stuff" )
This description is then passed in the //Auxiliary// parameter of the SYSMSG event as noted above.
Hopefully you will find this facility useful if you ever suffer from problems with **SAVEWARN** in the future.
=== Comments ===
----
=== At 31 JUL 2019 04:10AM James Birnie wrote: ===
Nice implementation.
Veteran indeed!?
== Original ID: revdevx.com/?p=2875 ==