A better way to do this is to trap the low-level ETM_DELETEROW notification sent by the EditTable prior to the actual DELETEROW event occuring. However, this notification has to be handled in a synchronous fashion (via a WINMSG event), and we also have to tell OpenInsight to return a special value from its own low-level internal message handler so that the EditTable stops the deletion (This last requirement is why the event has to be handled synchronously, because we need to return a value at the point in time that the message is sent).
We do this in two stages: First we tell OpenInsight to trap the WINMSG event for the EditTable and listen specifically for the ETM_DELETEROW message. This is normally done in a form's CREATE event like so:
0001 $insert logical
0002
0003 equ WM_USER$ to 1024
0004 equ ETM_INSERTROW$ to (WM_USER$ + 2004)
0005 equ ETM_DELETEROW$ to (WM_USER$ + 2005)
0006
0007 eventOp = TRUE$ ; * // Turn tracking on
0008 eventOp<4> = TRUE$ ; * // Track Synchronously
0009
0010 call send_Message( @window : ".TABLE_1", |
0011 "QUALIFY_EVENT", |
0012 ETM_DELETEROW$, |
0013 eventOp )
0002
0003 equ WM_USER$ to 1024
0004 equ ETM_INSERTROW$ to (WM_USER$ + 2004)
0005 equ ETM_DELETEROW$ to (WM_USER$ + 2005)
0006
0007 eventOp = TRUE$ ; * // Turn tracking on
0008 eventOp<4> = TRUE$ ; * // Track Synchronously
0009
0010 call send_Message( @window : ".TABLE_1", |
0011 "QUALIFY_EVENT", |
0012 ETM_DELETEROW$, |
0013 eventOp )
Next we have to add a WINMSG event handler to the EditTable to catch the ETM_DELETEROW message:
0001 $insert logical
0002
0003 equ WM_USER$ to 1024
0004 equ ETM_INSERTROW$ to (WM_USER$ + 2004)
0005 equ ETM_DELETEROW$ to (WM_USER$ + 2005)
0006
0007 begin case
0008 case ( message = ETM_DELETEROW$ )
0009 * // Stop the delete here...
0010 call set_WinMsgVal( TRUE$, 0 ) ; * // Force PS to return 0
0011 ; * // to Windows
0012
0013 end case
0002
0003 equ WM_USER$ to 1024
0004 equ ETM_INSERTROW$ to (WM_USER$ + 2004)
0005 equ ETM_DELETEROW$ to (WM_USER$ + 2005)
0006
0007 begin case
0008 case ( message = ETM_DELETEROW$ )
0009 * // Stop the delete here...
0010 call set_WinMsgVal( TRUE$, 0 ) ; * // Force PS to return 0
0011 ; * // to Windows
0012
0013 end case
Set_WinMsgVal
Notice the use of the Set_WinMsgVal function. This function only works from within a synchronous WINMSG event and it allows us to set the actual low-level value that OpenInsight returns internally from handling the ETM_DELETEROW message. Returning 0 here tells the EditTable not to allow the row deletion.
Preventing Row Insertion
We can also prevent users from inserting rows in a similar fashion, by trapping the ETM_INSERTROW message instead (which we've defined in the examples above). However, implementing this is an exercise left for the reader.
No comments:
Post a Comment