********** >* Traditional code block -- exiting all the way out from an inner loop >***** > llBigExit = .F. > SELECT myTable > SCAN > FOR lnI = 1 TO 10 > IF someTestOnThisData(lnI) > llBigExit = .T. > WAIT WINDOW "It was found!" > EXIT > ENDIF > NEXT > IF llBigExit > EXIT > ENDIF > ENDSCAN > IF NOT llBigExit > WAIT WINDOW "Sorry, Charlie!" > ENDIF > > >********** >* Visual FreePro's ROPE..ENDROPE structured flow for exiting all the way out >* with the single SWING OUT command, which continues on after the ENDROPE. >* Note also that no EXIT command is needed to exit a ROPE..ENDROPE block. >***** > ROPE > SELECT myTable > SCAN > FOR lnI = 1 TO 10 > IF someTestOnThisData(lnI) > WAIT WINDOW "It was found!" > SWING OUT > ENDIF > NEXT > ENDSCAN > WAIT WINDOW "Sorry, Charlie!" > ENDROPE > * Control continues here after SWING OUT command > > >********** >* An extended ability to SWING TO a specific destination, yet in a structured >* manner. >* >* Note: One of the purposes of adding this ability was to document major code >* blocks in one specific area (near the end of the ROPE..ENDROPE block), >* thereby bringing important algorithms out of interspersed, nested code, >* and into more centralized, easily sought after areas. >***** > ROPE > SELECT myTable > SCAN > FOR lnI = 1 TO 10 > IF someTestOnThisData(lnI) > SWING TO foundIt > ENDIF > NEXT > ENDSCAN > SWING TO notFound > > PLATFORM foundIt > WAIT WINDOW "It was found!" > > PLATFORM notFound > WAIT WINDOW "Sorry, Charlie!" > > ENDROPE > * Control continues here after each platform code block is run > > >********** >* Adding FUNCTION definitions to a ROPE..ENDROPE block, as you >* would any program. These are in addition to ADHOC..ENDADHOC function >* blocks, which can also be added anywhere. >* >* Note: The same note above is added for functions, as this helps with >* encapslation, such that related functions are included within the >* ROPE..ENDROPE block, also aiding with documentation, debugging, and >* code maintenance. >***** > ROPE > SELECT myTable > SCAN > FOR lnI = 1 TO 10 > IF someTestOnThisData(lnI) > SWING TO foundIt > ENDIF > NEXT > ENDSCAN > SWING TO notFound > > FUNCTION showMessage > LOBJECT po AS (pcMessage AS Character) > WAIT WINDOW pcMessage > > PLATFORM foundIt > showMessage("It was found!") > > PLATFORM notFound > showMessage("Sorry, Charlie!") > > ENDROPE > * Control continues here after each platform code block is run > > >********** >* Adding ERROR handling to a ROPE..ENDROPE block >* Note: The new ERROR block at the end is called instead of any >* ON ERROR or class Error() events. A future support will >* allow for explicit number handling as in "ERROR nCode" >* so that multiple ERROR blocks can be added, one for each >* type of known error. >***** > ROPE > SELECT myTable > SCAN > FOR lnI = 1 TO 10 > IF someTestOnThisData(lnI) > SWING TO foundIt > ENDIF > NEXT > ENDSCAN > SWING TO notFound > > FUNCTION showMessage > LOBJECT po AS (pcMessage AS Character) > WAIT WINDOW pcMessage > > PLATFORM foundIt > showMessage("It was found!") > > PLATFORM notFound > showMessage("Sorry, Charlie!") > > ERRROR thisCodeOfError > ERRORMESSAGEBOX(thisCodeOfError) && Show Visual FreePro standard error message handler > > ENDROPE > * Control continues here after each platform code block is run > > >********** >* Adding simple MESSAGE handling to a ROPE..ENDROPE block. In this >* example, the called function is used to spawn control flow in this >* ROPE..ENDROPE block, and that's based upon its known return results. >* This removes the requirement of us testing the result here, as our >* program can simply act on it. The new MEMA keyword indicates that >* this source code line will respond to the RETURN MESSAGE command >* flow control, and automatically SWING TO the MESSAGE code block. >* The MESSAGE code block receives as a named parameter the thisCode >* object of whatever triggered the MESSAGE. In this case, it would be >* the thisCode object pointing to the source code line with MEMA on it. >***** > ROPE > SELECT myTable > SCAN > FOR lnI = 1 TO 10 > * The following function is shown below. > * It uses the new RETURN MESSAGE command. > someTestOnThisData(lnI) MEMA > NEXT > ENDSCAN > SWING TO notFound > > FUNCTION someTestOnThisData > LOBJECT po AS (pnCount AS Integer) > IF SUBSTR(cName, pnCount, 4) == "rick" > RETURN MESSAGE "It was found!" > ENDIF > > FUNCTION showMessage > LOBJECT po AS (pcMessage AS Character) > WAIT WINDOW pcMessage > > PLATFORM notFound > showMessage("Sorry, Charlie!") > > MESSAGE msg > * Note: The thisCode object has an _m1 member which is the first > * parameter of the returned message. _m2 continues on, _m3, > * _m4, and so on. Each of these is sticky and persist until > * another RETURN MESSAGE command is encountered. > showMessage(msg._m1) > > ENDROPE > * Control continues here after each platform code block is run > > >********** >* Adding a more advanced MESSAGE handler to a ROPE..ENDROPE block. In >* this example, the called function is able to spawn flow control based >* upon its known return results. The MEMA SWING TO command is used to >* swing to a specific platform destination by name. In this case we >* know the called function will return a message if the item is found. >* As such, we trigger off of that condition automatic flow control. >***** > ROPE > SELECT myTable > SCAN > FOR lnI = 1 TO 10 > * The following function is shown below. > * It uses the new RETURN MESSAGE command. > someTestOnThisData(lnI) MEMA SWING TO foundIt WITH thisCode._m1 > NEXT > ENDSCAN > SWING TO notFound > > FUNCTION someTestOnThisData > LOBJECT po AS (pnCount AS Integer) > IF SUBSTR(cName, pnCount, 4) == "rick" > RETURN MESSAGE "It was found!" > ENDIF > > FUNCTION showMessage > LOBJECT po AS (pcMessage AS Character) > WAIT WINDOW pcMessage > > * Here we see that the destination PLATFORM can receive parameters like a function. > PLATFORM foundIt > LOBJECT po AS (pcMessage AS Character) > showMessage(pcMessage) > > PLATFORM notFound > showMessage("Sorry, Charlie!") > > ENDROPE > * Control continues here after each platform code block is run > > >********** >* Had I gone with the flow controller, or FLOWER definition, it would >* have been like this instead of ROPE..ENDROPE (picture a bee flying >* about a flower). >* >* What do you think? Too girly? :-) I actually like this because it >* would be very hard to not be enjoying writing code when in your mind >* you're flying around flowers. :-) >***** > FLOWER > * Normal programming goes here > FLY TO cPetalName && Instead of "swing to" the bee would "fly to" > > PETAL cPetalName > LOBJECT po AS (pcParam1 AS Character, pnParam2 AS Integer) > > FUNCTION cFunctionName > LOBJECT po AS (pcParam1 AS Character, pnParam2 AS Integer) > RETURNS llResult > > MESSAGE > > ERROR > > ENDFLOWER >>