|
|||||||
A common requirement when dealing with EditTables is to prevent a user from deleting a row on a case by case basis at runtime. In many applications we've seen this implemented by trapping the standard DELETEROW event and then sending an INSERT message with the deleted row contents, but this looks messy and unprofessional because the data disappears and reappears again.
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 ) 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 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. Labels: EditTable, EditTable Cookbook, OpenInsight |
|||||||
| |||||||
0 Comments:
Post a Comment
Subscribe to Post Comments [Atom]
<< Home