showlater
showlater

The showlater statement defers the display of text and graphics until the procedure is finished.

Parameters

No parameters.

Description

This statement defers the display of text and graphics until all currently running procedures are finished. (This includes any subroutines called after this statement is used.)

To understand this statement, let’s first review how display normally happens. As a procedure runs, Panorama normally updates the display immediately as actions are taken. For example, consider this code that modifies three database fields.

    First = "Bob"
    Last = "Wilson"
    Phone = "555-1212"

If you watch closely as this code runs, you’ll see that Panorama actually updates the display 3 times as this code runs - first to display the first name, then the last name, and finally displaying the phone number. In the example above this happens so quickly you might not notice it, but if you run actions that display the entire window this will be more noticeable. When you run the code below you’ll clearly see the window flash three times as the the code runs.

    field State
    sortup
    field City
    sortupwithin
    select zipdistance(90001,Zip) < 50

In many situations you really don’t need immediate display of each change – it’s fine if the display doesn’t update until the entire procedure is finished. If you put a showlater statement at the top of the procedure, that’s exactly what will happen. Here’s a revision of the first procedure that doesn’t flash three times, only once at the end.

    showlater
    First = "Bob"
    Last = "Wilson"
    Phone = "555-1212"

Notice that you don’t need to tell Panorama update the display, it does that automatically when the procedure is finished. You also don’t need to tell Panorama what needs to be displayed, it keeps track of that itself.

Here is a revised version of the sort/select example that only flashes the screen once:

    showlater
    field State
    sortup
    field City
    sortupwithin
    select zipdistance(90001,Zip) < 50

### Some Implicitly Triggered Procedures Automatically Defer Display

Procedures are usually triggered explicitlly by pressing a button or using a menu, but Panorama also has a variety of Implicitly Triggered Procedures that run automatically when specific actions are performed, for example when a record is modified or a form is brought to the front. Some of these procedures are triggered while Panorama is in the middle of performing another task that cannot be interrupted by updating the display. When running these particular procedures, Panorama automatically defers display until the procedure is finished running. It’s essentially as if you had put a showlater statement at the top of the procedure.

The implicitly triggered procedures that automatically defer display are:

- Code that runs when a field is modified (see Automatic Field Code).
- Code that is triggered by a Text Editor Object.
- The .ModifyRecord procedure (see Implicitly Triggered Procedures).
- The .CurrentRecord procedure (see Implicitly Triggered Procedures).
- Code that is triggered by a form event (see Implicitly Triggered Procedures).

Implicitly triggered procedures that are not listed above do not defer display (unless you include a showlater statement).

### EndShowLater

When the showlater statement is used all display is normally deferred until the end of the procedure, but you can use the endshowlater statement to update the display immediately. All operations after the endnoshow statement will update the display immediately (unless you use the showlater statement again).

Note: You should not use the endnoshow statement in an implicitly triggered procedure that automatically defers display (see above). Panorama won’t stop you from doing this or throw an error, but this may cause incorrect operation.

### The info(“showlater”) function

Use the info(“showlater”) function if your code needs to find out whether or not Panorama is currently deferring display. For example you could use this in a subroutine to find out if the code that called the subroutine has already started deferring display. You can also use this in an implicitly triggered procedure to double check whether Panorama has automatically deferred display during this procedure.

### ShowLater vs. NoShow

Panorama’s noshow statement performs a similar function to the showlater statement. However, the internal operation of these statements are slightly different. To understand the difference, let’s review how Panorama normally updates the display when a change is made.

1. Code makes a change to the database, either to an individual field (for example an assignment), a column (for example formula fill) or the entire database (for example sorting.
2. Panorama analyzes each window associated with the database to determine what area of the window (if any) need to be updated. For example if an individual field has been modified, any open forms will be analyzed to see if any objects display that field (this usually happens because the formula associated with the object contains the field name). If there is any area that needs to be displayed, Panorama passes the co-ordinates of the area to the operating system.
3. Panorama pauses execution of the code to give the operating system a chance to perform the run loop and actually update the affected areas. To learn more about this step, see Understanding the Run Loop. When the run loop finishes, the Panorama code resumes.

When the showlater statement is used, the third step is skipped. Panorama still analyzes what areas need to be displayed, but it doesn’t actually give the operating system a chance to display the changes. This eliminates extra flashes, and it also eliminates the problem of the operating system run loop interfering with the internal operation of Panorama when certain implicitly triggered procedures are run.

When the noshow statement is used, both the second and third steps are skipped. If you are performing a lot of operations, this will be slightly faster because Panorama isn’t taking the time to analyze what areas of the screen need to be updated. Usually this speed difference is insignificant, but if you are using a form with hundreds of objects and your procedure makes hundreds of changes, the difference may be noticeable. Note: Since step 2 has been skipped, your code must eventually explicitly specify what areas to display using showline, showfields, showpage, showvariables etc.

Here is an example of a procedure that clears out all of the line items in the current record. In its simplest form, the display is updated for each field immediately as the procedure runs.

    looparray dbinfo("lineitemfields",""),cr(),fname
        set fname,?(datatype(fname)="Text","",zeroblank(0))
    endloop

Running on an M1 processor with a database with 132 line item fields (33 line items with 4 fields for each line), the code above takes 205 milliseconds to run (about 0.2 seconds).

Adding the showlater statement doubles the speed, to 101 milliseconds.

    showlater
    looparray dbinfo("lineitemfields",""),cr(),fname
        set fname,?(datatype(fname)="Text","",zeroblank(0))
    endloop

Using noshow is over 6 times faster, only 13 milliseconds.

    noshow
    looparray dbinfo("lineitemfields",""),cr(),fname
        set fname,?(datatype(fname)="Text","",zeroblank(0))
    endloop
    showline
    endnoshow

Of course you might not notice an 88 millisecond difference in the real world. The noshow statement is slightly more complicated to use, so you’ll have to decide if the performance difference will be significant for your application.

See Also

- endnoshow -- resumes the output of text and graphics after it has been disabled with the noshow statement.
- endshowlater -- resumes the immediate display of text and graphics after it has been deferred with the showlater statement.
- fontcharacters( -- returns a string (text) containing all of the characters supported by the specified font.
- fontinfo( -- returns a dictionary with information about a specified font.
- hide -- temporarily disables the output of text and graphics.
- info("noshow") -- returns true if noshow is currently turned on, false if it is not.
- measuretext( -- returns the size of a string of text in a particular font and size.
- noshow -- temporarily disables the output of text and graphics.
- richtextdata( -- adjusts text so that it will display properly in rich text even if it contains a < character.
- richtextdisplay( -- works with Text Display objects to display text with multiple styles, fonts, colors and alignments.
- setbannericon -- sets the icon on the right side of the toolbar banner.
- setbannermessage -- sets the text in the toolbar banner to an arbitrary message.
- setbannerprogressbar -- displays progress in the toolbar banner.
- show -- resumes the output of text and graphics after it has been disabled and then forces Panorama to redisplay all windows in the current database.
- showcolumns -- forces Panorama to display specified fields.
- showfields -- forces Panorama to display specified fields.
- showline -- forces Panorama to redisplay the current record in all windows in the current database.
- showother -- forces Panorama to update some data on the screen.
- showpage -- forces Panorama to redisplay all windows in the current database.
- showrecordcounter -- forces Panorama to redisplay the record counter in all windows in the current database.
- showvariables -- forces Panorama to update the display of one or more variables on every form in the active database.
- textdisplay( -- works with Text Display Objects to control the color and style of text on the fly.

History

Version | Status | Notes
10.2 | New | New in this version0.