Home page Home page Home page Home page
Pixel
Pixel Header R1 C1 Pixel
Pixel Header R2 C1 Pixel
Pixel Header R3 C1 Pixel
Pixel
By Captain C | Tuesday 24 April 2012 10:10 | 0 Comments
As you'll doubtless know there are several core routines used in Basic+ to interact with OI forms, probably the three most important being:

  • Get_Property()

  • Set_Property()

  • Send_Message()

To maximize performance when dealing with properties it is common practice to pass @rm-delimited arrays to Get_Property and Set_Property like so:


0001  /* 
0002     Example to illustrate accessing properties via @rm-delimited arrays.
0003      
0004     i.e to replace code like this:
0005     
0006        call set_Property( @window, "TEXT", "Customers" )
0007        call set_Property( @window, "TRACKINGSIZE", trkSize )
0008        call set_property( @window, "VISIBLE", TRUE$ ) 
0009        
0010     ... and so on...
0011  */
0012  
0013     objxArray =        @window
0014     propArray =        "TEXT"
0015     dataArray =        "CUSTOMERS"
0016   
0017     objxArray := @rm : @window
0018     proparray := @rm : "TRACKINGSIZE"
0019     dataArray := @rm : trkSize
0020  
0021     objxArray := @rm : @window
0022     propArray := @rm : "VISIBLE"
0023     dataArray := @rm : TRUE$
0024  
0025     call set_Property( objxArray, propArray, dataArray )
0026     


A recent support query from one of our clients was to enquire if the Send_Message() function also supported a similar interface, and unfortunately the answer is no - it does not accept @rm-delimited arguments when invoked.

However the question did trigger a distant memory that led me to dig up a very old email thread from many years ago between ourselves and developers at Revelation, during which a similar capability was discussed and implemented, but alas, it appears, never documented.

Whilst Send_Message() itself doesn't support @rm-delimited arrays of message data, the Set_Property() function does support a "SEND_MESSAGE" property which can be used in a similar manner - you simply wrap the message name and arguments into an @fm-delimited array and use this as the new property value to set.

e.g.


0001  /* 
0002     Example to illustrate calling messages via @rm-delimited 
0003     arrays. 
0004      
0005     i.e to replace code like this: 
0006       
0007       call send_Message( @window, "COLOR_BY_POS", colPos, rowPos, cellColor ) 
0008       call send_Message( @window, "COLSTYLE", colPos, colStyle ) 
0009        
0010    ... and so on... 
0011  */
0012  
0013     colPos    = 3
0014     rowPos    = 0
0015     cellColor = RED$ : @fm : WHITE$ : @fm : GREEN$ : @fm : YELLOW$
0016  
0017     convert @fm to @vm in cellColor
0018  
0019     objxArray =        @window : ".TABLE_1"
0020     propArray =        "SEND_MESSAGE"
0021     dataArray =        "COLOR_BY_POS" : @fm : colPos : @fm : rowPos : |
0022                        @fm : cellColor
0023  
0024     objxArray := @rm : @window : ".TABLE_1"
0025     proparray := @rm : "SEND_MESSAGE"
0026     dataArray := @rm : "COLSTYLE" : @fm : colPos : @fm : colStyle
0027  
0028     call set_Property( objxArray, propArray, dataArray )
0029     


Notice the convert statement in the code above - if you use any system delimiters in your message arguments (@fm,@vm,@svm,@tm) then you must convert them down a level, because the SEND_MESSAGE property will convert them up a level before executing the message internally.

In this way we can duplicate the stacking behaviour of Get and Set_Property for Send_Message.

Labels:

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]



<< Home

Pixel
Pixel Footer R1 C1 Pixel
Pixel
Pixel
Pixel