Version 0.1.029 (released December 31st, 2016)
The focus of this release is documentation. There are several hundred pages of new documentation, including Image Display, Text List, Matrix, Tab Panel and Report Tile objects. At this point virtually all new Panorama X form (graphics mode) features are fully documented. Data Arrays are also now fully documented.

This release also includes a number of minor new features and bug fixes:

- Added Column Stats dialog to data sheet for numeric fields (total, count, average, std deviation). Simply right click on a numeric cell to see the statistics.

- Implemented the WindowToBack statement.

- The Text Export wizard now only looks in the first line of text to decide whether the text is tab or comma delimited.

- Fixed insert and delete fields so that they work properly even if the user is editing the field name at the time they are used. To accomplish this, the datafocus statement was created.

- The info(“availablescreenrectangle”) function now correctly excludes the dock from the returned rectangle.

- Text Editor objects can now display the text in any color (by setting the object color – this is not rich text). Unlike Panorama 6, the text is still colored as it is edited.

- The “Across” printing mode now works even with multiple page reports.

- The Notes property now works properly in blueprints and when using the setfieldproperties statement.

- New Line object property – LineSlope, can be Positive or Negative. If Positive, the line slopes up, if Negative, the line slopes down. This property appears in blueprints, and can be used in objectinfo(, newformobject, changeobject, and changeobjects.

- The setdictionaryvalue statement now allows multiple key/value changes to be made in a single statement (the code always allowed this, but the comment header was wrong).

- The GoForm statement now sets the window title to the target form name (unless a title option is specified, in which case it changes to whatever is specified).

- Fixed the lineitemarray( function so that it can work with any separator, not just carriage returns. Also this function now just outputs numbers and dates in “raw” format, not using the field’s output pattern.

- When a procedure window is active, items in the File menu that are not applicable are now disabled.

- Fixed the cgilink( function.

- Fixed the htmldatatable statement.

- Multiplication and subtraction added to the help file.

Brand new features implemented in this release (features that were not included in Panorama 6):

- Data Arrays -- A numbered collection of data values.
- datafocus -- The datafocus statement makes sure that Panorama is focused on data, not on a property panel.
- Displaying Data in a Grid -- fundamentals of displaying data in a grid (Text List/Matrix).
- Image Display Animations -- animated images.
- Image Display Colors and Gradients -- displaying pure colors and gradients
- Image Display Data Buttons -- checkboxes and radio buttons created from custom images.
- Image Display Push Buttons -- push buttons created from custom images.
- Matrix Clicking -- handling clicks in a Matrix Object.
- Matrix Constructor -- quickly creating a Matrix Object from a template.
- Matrix Database Integration -- synchronizing a Matrix Object with a database.
- Matrix Geometry -- customizing the size and geometry of Matrix Object elements.
- Matrix Header and Horizontal Scrolling -- setting up a custom header for a Matrix Object grid.
- Matrix Object Frame -- setting up the arrangement of items within a Matrix Object.
- Matrix Object -- displaying a grid of items with a custom arrangement.
- Report Tile Object -- component for assembling a custom report.
- Tab Panel Appearance -- appearance options for a Tab Panel Object.
- Tab Panel Buttons and Selection -- button options for a Tab Panel Object.
- Tab Panel Constructor -- quickly creating a Tab Panel Object from a template.
- Tab Panel Content -- setting up the content for a Tab Panel Object.
- Tab Panel Forms -- setting up the forms for a Tab Panel Object.
- Tab Panel Object -- switchable tab panels.
- Text List Appearance -- customizing the appearance of a Text List Object.
- Text List Constructor -- quickly creating a Text List Object from a template.
- Text List Database Integration -- synchronizing a Text List Object with a database.
- Text List Multiple Columns -- displaying multiple columns in a Text List Object
- Text List Object -- displaying a grid of text.
- Text List Programming -- programming a Text List Object.
- Text List Searching -- searching within a Text List Object.
- Text List Selection -- selecting items in a Text List Object.

Features implemented in this release that work differently than they did in Panorama 6.

- Fixed Image Object -- is used for fixed images (images that never change).
- Image Display Object -- is used for dynamic images (images that change depending on the data).

Features implemented in this release that work exactly the same as they did in Panorama 6.

- - -- The - operator subtracts the numeric value on the right from the numeric value on the left.
- * -- The * operator multiplies the numeric value on the left by the numeric value on the right.
- windowtoback -- The windowtoback statement sends a Panorama window to the back, behind all other windows (including non-Panorama windows).

ALL features that were added or changed in this release:

- - -- The - operator subtracts the numeric value on the right from the numeric value on the left.
- activeobjectaction -- The activeobjectaction statement allows a procedure to communicate with the object on the current form that is currently being edited (if any).
- alertsheet -- The alertsheet statement displays an alert sheet (attached to the current window) with a message and one or more buttons. Note: with the introduction of OS 11, Big Sur, sheets no longer appear to slide down from the title bar, but open a dialog centered on the active window.
- appenddictionaryvalue -- The appenddictionaryvalue statement appends a value to an item in a dictionary (see Data Dictionaries).
- array( -- The array( function extracts a single data item from a text array or a data array (see Text Arrays and Data Arrays).
- arraychange( -- The arraychange( function changes the value of a single data item in a text array or a data array (see Text Arrays and Data Arrays).
- arraycontains( -- The arraycontains( function checks to see if any element of a text array or a data array matches a specified value.
- arraydelete( -- The arraydelete( function deletes (removes) one or more elements from a text array or a data array (see Text Arrays and Data Arrays).
- arrayfilter( -- The arrayfilter( function processes each element of a text array or a data array with a formula (see Text Arrays and Data Arrays).
- arraynotcontains( -- The arraynotcontains( function is the reverse of arraycontains(. it returns false if the value is in the array, true if it is not in the array.
- arrayrange( -- The arrayrange( function extracts a series of data items from a text array or a data array (see Text Arrays and Data Arrays).
- arrayrelocate( -- The arrayrelocate( function moves one or more items to a new position in a text array or a data array (see Text Arrays and Data Arrays).
- arrayreverse( -- The arrayreverse( function reverses the order of the elements in a text array or a data array (see Text Arrays and Data Arrays).
- arraysearch( -- The arraysearch( function searches a text array or a data array (see Text Arrays and Data Arrays) to see if it contains a specific value.
- arraysize( -- The arraysize( function returns the number of elements in a text array or a data array (see Text Arrays and Data Arrays).
- arraystrip( -- The arraystrip( function removes any blank elements from a text array or a data array (see Text Arrays and Data Arrays).
- Automatic Mailing Label Construction -- creates a mailing label.
- changedictionaryname -- The changedictionaryname statement changes the name (key) of an item in a dictionary (see Data Dictionaries).
- changedictionaryvalues( -- The changedictionaryvalues( function changes one or more values in a dictionary (see Data Dictionaries).
- changeobjects -- The changeobjects statement modifies the properties of one or more objects in a form.
- closeactiveobject -- The closeactiveobject statement closes any object whose text is currently being edited.
- copypartialdictionary -- The copypartialdictionary statement builds a new dictionary and initializes it with values from an existing dictionary (see Data Dictionaries).
- Creating a New Form -- creating a new empty form, or a duplicate of an existing form.
- Data Button Object -- is used to create checkboxes and radio buttons.
- Data Dictionaries -- Overview of Panorama's key/value data dictionaries.
- datafocus -- The datafocus statement makes sure that Panorama is focused on data, not on a property panel.
- deletedictionaryvalue( -- The deletedictionaryvalue( function deletes one or more key/value pairs from a dictionary (see Data Dictionaries).
- deletedictionaryvalue -- The deletedictionaryvalue statement deletes a key/value pair from a dictionary (see Data Dictionaries).
- dictionarydifference -- The dictionarydifference statement builds an array that lists keys of dictionary values that are different between two dictionaries (see Data Dictionaries).
- dictionaryvalueexists( -- The dictionaryvalueexists( function returns true or false depending on whether or not a key/value pair exists in a dictionary (see Data Dictionaries).
- dictionaryvalueexists -- The dictionaryvalueexists statement returns true or false depending on whether or not a key/value pair exists in a dictionary (see Data Dictionaries).
- Displaying Data in a Grid -- fundamentals of displaying data in a grid (Text List/Matrix).
- dumpdictionary( -- The dumpdictionary( function returns a carriage return separated array of dictionary keys and values (see Data Dictionaries).
- dumpdictionary -- The dumpdictionary statement returns a carriage return separated array of dictionary keys and values (see Data Dictionaries).
- dumpdictionaryquoted( -- The dumpdictionaryquoted( function returns a carriage return separated array of dictionary keys and values (see Data Dictionaries). The text values are quoted.
- dumpdictionaryquoted -- The dumpdictionaryquoted statement returns a carriage return separated array of dictionary keys and values (see Data Dictionaries).
- execute( -- The execute( function allows a formula to execute a sequence of statements and return a result.
- execute -- The execute statement allows a procedure to call a sequence of statements within the current procedure as a "mini-subroutine".
- exportcell( -- The exportcell( function takes any database field and converts it to text, using the appropriate display pattern if one has been defined for the field.
- Fixed Image Object -- is used for fixed images (images that never change).
- Font Awesome Icons -- are over 600 ready-made icons built right into Panorama.
- Fonts -- setting the font and text size of form text objects.
- Form Object Appearance -- changing the color, fill, stroke, opacity and drop shadow attributes of selected objects.
- Form Object Blueprint -- display and edit raw object specifications
- functionvalue -- The functionvalue statement returns a value calculated by a procedure using the call(, callwithin( or execute( functions.
- getdictionarykey( -- The getdictionarykey( function returns the key of an item in the dictionary, given its value). This is essentially the opposite of the getdictionaryvalue( function (see Data Dictionaries).
- getdictionarykey -- The getdictionarykey statement returns the key of an item in the dictionary, given its value. This is essentially the opposite of the getdictionaryvalue( function (see Data Dictionaries).
- getdictionaryvalue( -- The getdictionaryvalue( function returns the value of an item in the dictionary, given its key (see Data Dictionaries).
- getdictionaryvalue -- The getdictionaryvalue statement returns the value of an item in the dictionary, given its key (see Data Dictionaries).
- global -- The global statement creates one or more global variables.
- graphicsmode -- The graphicsmode statement switches a form into graphics mode.
- Image Display Animations -- animated images.
- Image Display Push Buttons -- push buttons created from custom images.
- info("buttonrectangle") -- The info("buttonrectangle") function returns a rectangle defining the edges of the most recently clicked button.
- info("focusobject") -- The info("focusobject") function returns the name of the currently active text editor or word processor object, if any.
- info("focusobjectid") -- The info("focusobjectid") function returns the object ID of the currently active text editor or word processor object, if any.
- info("visible") -- The info("visible") function returns true if the current record is visible and false if it is invisible.
- initializedictionary( -- The initializedictionary( function builds a new dictionary and initializes it with one or more key/value entries (see Data Dictionaries).
- initializedictionary -- The initializedictionary statement builds a new dictionary and initializes it with one or more key/value entries (see Data Dictionaries).
- initializedictionaryvalue( -- The initializedictionaryvalue( function builds a new dictionary and initializes it with one or more entries (see Data Dictionaries). This function is deprecated, we recommend using the initializedictionary( function instead.
- Line Object -- draws a line within a form.
- listdictionarykeys( -- The listdictionarykeys( function returns a list of the keys in a dictionary collection.
- listdictionarynames -- The listdictionarynames statement returns a list of the names (keys) in a dictionary (see Data Dictionaries).
- maprectangle( -- The maprectangle( function maps the position and size of a rectangle within a template rectangle into the same relative position and size within a goal rectangle.
- Matrix Constructor -- quickly creating a Matrix Object from a template.
- Matrix Database Integration -- synchronizing a Matrix Object with a database.
- mergedictionaries( -- The mergedictionaries( function merges the contents of two or more dictionaries (see Data Dictionaries).
- mergedictionaries -- The mergedictionaries statement merges the contents of two or more dictionaries (see Data Dictionaries).
- moveobjects -- The moveobjects statement will move an object or group of objects up, down, left or right on the form.
- Object Inspector Panel -- is used to view and modify the attributes of selected objects in a form.
- objectaction -- The objectaction statement allows a procedure to communicate with an object on the current form.
- Panorama Database Exchange -- Panorama Database Exchange allows you to download databases uploaded by other Panorama users.
- Panorama X vs. Panorama 6 -- Early release status report.
- Polygon Object -- draws a polygon within a form.
- Popup Menu Button Object -- is used to create popup menus anywhere on a form.
- randomline( -- The randomline( function returns a random line from multiple lines of text.
- renamedictionarykey( -- The renamedictionarykey( function changes the key (name) of one or more values in a dictionary (see Data Dictionaries).
- Report Tile Object -- component for assembling a custom report.
- Rich Text -- is used to display styled text, including bold, italic, colors, tabs, even images.
- Scroll Bar Object -- is used to create scroll bars.
- Segmented Button Object -- is used to created segmented buttons.
- setdictionaryvalue -- The setdictionaryvalue statement changes a value in a dictionary (see Data Dictionaries).
- Slider Object -- is used to create sliders and knobs.
- standardconstructgraphicsmenu( -- The standardconstructgraphicsmenu( function generates a Custom Menu specification for Panorama’s standard Construct menu (in Graphics Mode).
- Stepper Object -- is used to create numeric steppers for use with Text Editor objects.
- Tab Panel Appearance -- appearance options for a Tab Panel Object.
- Tab Panel Buttons and Selection -- button options for a Tab Panel Object.
- Tab Panel Constructor -- quickly creating a Tab Panel Object from a template.
- Tab Panel Content -- setting up the content for a Tab Panel Object.
- Tab Panel Forms -- setting up the forms for a Tab Panel Object.
- Tab Panel Object -- switchable tab panels.
- tagcount( -- The tagcount( function counts the number of times a specified tag (usually an HTML tag) appears in the text. See Tag Parsing for more information on HTML tags.
- tagend( -- The tagend( function returns the ending position of the specified tag (usually an HTML tag) in the text.
- tagnumber( -- The tagnumber( function checks to see if a specified position is inside of a tag (usually an HTML tag).
- tagparameter( -- The tagparameter( function extracts the value of a tag parameter embedded in some text, where the tag parameter takes the form name=value.
- tagstart( -- The tagstart( function returns the starting position of the specified tag (usually an HTML tag) in the text.
- tagstrip( -- The tagstrip( function removes tags (usually HTML tags) from within a piece of text.
- tan( -- The tan( function calculates the tangent of an angle.
- Text Arrays -- A numbered collection of text values.
- Text Funnels -- Text funnels strip off the beginning and/or end of a text string based on your specifications.
- Text Label Object -- displays a short, fixed, text item within a form.
- Text List Constructor -- quickly creating a Text List Object from a template.
- Text List Multiple Columns -- displaying multiple columns in a Text List Object
- Text List Object -- displaying a grid of text.
- Text List Programming -- programming a Text List Object.
- Text List Searching -- searching within a Text List Object.
- Text List Selection -- selecting items in a Text List Object.
- textdisplay( -- The textdisplay( function works with Text Display Objects to control the color and style of text on the fly.
- textlisttableoptions -- The textlisttableoptions statement sets up text list table options
- textstuff( -- The textstuff( function replaces one or more characters in the middle of a piece of text.
- texttobinary( -- The texttobinary( function converts text into binary data, optionally using a specified encoding.
- time( -- The time( function converts text into a number representing a time.
- timepattern( -- The timepattern( function converts a number representing a time into text. The function uses a pattern to control how the time is formatted.
- timerinfo( -- The timerinfo( function returns a dictionary that contains all of the properties of a timer.
- unionrectangle( -- The unionrectangle( function creates a rectangle by combining two rectangles. The new rectangle is large enough to exactly cover both of the input rectangles.
- uniqueid( -- The uniqueid( function generates ID codes with a text root and a numeric suffix (for example `Jeff261`).
- until -- The until statement is used at the end of a loop, and can control how many times the loop is executed.
- uprecord -- The uprecord statement moves the cursor up one visible record.
- url( -- The url( function synchronously loads a resource from the internet.
- urltaskcancel -- The urltaskcancel statement aborts a download initiated with the urltask( function.
- urltaskstatus -- The urltaskstatus statement enables connection error checking in urltask( completion code.
- usebashprofile -- The usebashprofile statement grabs the search path from the `.Bash_profile` file in the user's home folder, so that these paths will be used by scripting languages (Ruby, Python, etc.).
- usecallerslocalvariables -- The usecallerslocalvariables statement temporarily swaps out a subroutine's current local variables with the local variables of the procedure that called this subroutine. The statement can be used only in a subroutine, not in a calling procedure.
- usemylocalvariables -- The usemylocalvariables statement reverses the action of the UseCallersLocalVariables statement, switching back to the current procedure's normal local variables.
- uspssecondaryunits( -- The uspssecondaryunits( function returns a list of USPS (United States Postal Service) secondary suffix designation abbreviations.
- v( -- The v( function returns the vertical position of a point (see point(, Graphic Coordinates).
- val( -- The val( function converts text into a number.
- visiblefieldnumbers( -- The visiblefieldnumbers( function returns a data array of visible fields (by number) in the data sheet.
- Web Browser Object -- is used to display web pages from within a Panorama form.
- webformlinknewwindow( -- The webformlinknewwindow( function generates a link to a Panorama form on the current web site.
- week1st( -- The week1st( function computes the first day of a week (Sunday).
- while -- The while statement is used at the end of a loop, and can control how many times the loop is executed.
- windowbox -- The windowbox statement specifies the dimensions (size and location) of the next window that is opened (with openform, opensheet, openprocedure etc.).
- windowglobal -- The windowglobal statement creates one or more windowglobal variables.
- windowmenubar -- The windowmenubar statement creates a custom menu bar or context menu for the current window (see Custom Menus).
- windowtoback -- The windowtoback statement sends a Panorama window to the back, behind all other windows (including non-Panorama windows).
- word( -- The word( function converts a number into a single word (2 bytes) of binary data (see Binary Data).
- wordarray( -- The wordarray( function extracts a value from an array of 16 bit words (see Binary Data).
- xor -- The xor operator returns true if one of the two parameters is true, false if neither or both are true.
- year1st( -- The year1st( function computes the first day of a year.
- years( -- The years( function converts a number of days into a number of years.
- zbpattern( -- The zbpattern( function converts a number to text using a pattern, but returns empty text if the number is zero.
- zipdistance( -- The zipdistance( function calculates the distance between two zip codes.
- zipinfo -- The zipinfo statement queries the web to obtain information about a zip code.
- ziplatitude( -- The ziplatitude( function returns the latitude of a US zip code.
- ziplongitude( -- The ziplongitude( function returns the longitude of a US zip code.

See Also

- Version 0.1.001 (released July 7th, 2012) -- Summary of Version 0.1.001 (released 7/7/2012)
- Version 0.1.002 (released August 12th, 2012) -- Summary of Version 0.1.002 (released 8/12/2012)
- Version 0.1.003 (released December 2nd, 2012) -- Summary of Version 0.1.003 (released 12/2/2012)
- Version 0.1.004 (released December 10th, 2012) -- Summary of Version 0.1.004 (released 12/10/2012)
- Version 0.1.005 (released December 21st, 2012) -- Summary of Version 0.1.005 (released 12/21/2012)
- Version 0.1.006 (released December 26th, 2012) -- Summary of Version 0.1.006 (released 12/26/2012)
- Version 0.1.007 (released May 1st, 2013) -- Summary of Version 0.1.007 (released 5/1/2013)
- Version 0.1.008 (released May 22nd, 2013) -- Summary of Version 0.1.008 (released 5/22/2013)
- Version 0.1.009 (released July 9th, 2013) -- Summary of Version 0.1.009 (released 7/9/2013)
- Version 0.1.010 (released October 14th, 2013) -- Summary of Version 0.1.010 (released 10/14/2013)
- Version 0.1.011 (released December 6th, 2013) -- Summary of Version 0.1.011 (released 12/6/2013)
- Version 0.1.012 (released August 29th, 2015) -- Summary of Version 0.1.012 (released 8/29/2015)
- Version 0.1.013 (released September 6th, 2015) -- Summary of Version 0.1.013 (released 9/6/2015)
- Version 0.1.014 (released September 14th, 2015) -- Summary of Version 0.1.014 (released 9/14/2015)
- Version 0.1.015 (released September 29th, 2015) -- Summary of Version 0.1.015 (released 9/29/2015)
- Version 0.1.016 (released October 12th, 2015) -- Summary of Version 0.1.016 (released 10/12/2015)
- Version 0.1.017 (released November 11th, 2015) -- Summary of Version 0.1.017 (released 11/11/2015)
- Version 0.1.018 (released December 7th, 2015) -- Summary of Version 0.1.018 (released 12/7/2015)
- Version 0.1.019 (released January 28th, 2016) -- Summary of Version 0.1.019 (released 1/28/2016)
- Version 0.1.020 (released February 15th, 2016) -- Summary of Version 0.1.020 (released 2/15/2016)
- Version 0.1.021 (released February 29th, 2016) -- Summary of Version 0.1.021 (released 2/29/2016)
- Version 0.1.022 (released March 1st, 2016) -- Summary of Version 0.1.022 (released 3/1/2016)
- Version 0.1.023 (released May 27th, 2016) -- Summary of Version 0.1.023 (released 5/27/2016)
- Version 0.1.024 (released June 12th, 2016) -- Summary of Version 0.1.024 (released 6/12/2016)
- Version 0.1.025 (released July 21st, 2016) -- Summary of Version 0.1.025 (released 7/21/2016)
- Version 0.1.026 (released August 29th, 2016) -- Summary of Version 0.1.026 (released 8/29/2016)
- Version 0.1.027 (released September 18th, 2016) -- Summary of Version 0.1.027 (released 9/18/2016)
- Version 0.1.028 (released November 9th, 2016) -- Summary of Version 0.1.028 (released 11/9/2016)
- Version 0.1.030 (released February 12th, 2017) -- Summary of Version 0.1.030 (released 2/12/2017)
- Version 0.1.031 (released March 3rd, 2017) -- Summary of Version 0.1.031 (released 3/3/2017)
- Version 0.1.032 (released April 3rd, 2017) -- Summary of Version 0.1.032 (released 4/3/2017)
- Version 0.9 (released May 15th, 2017) -- Summary of Version 0.9 (released 5/15/2017)
- Version 0.9.001 (released July 18th, 2017) -- Summary of Version 0.9.001 (released 7/18/2017)
- Version 0.9.002 (released July 27th, 2017) -- Summary of Version 0.9.002 (released 7/27/2017)
- Version 0.9.003 (released September 10th, 2017) -- Summary of Version 0.9.003 (released 9/10/2017)
- Version 0.9.004 (released September 14th, 2017) -- Summary of Version 0.9.004 (released 9/14/2017)
- Version 0.9.005 (released September 19th, 2017) -- Summary of Version 0.9.005 (released 9/19/2017)
- Version 0.9.006 (released September 27th, 2017) -- Summary of Version 0.9.006 (released 9/27/2017)
- Version 0.9.007 (released October 3rd, 2017) -- Summary of Version 0.9.007 (released 10/3/2017)
- Version 0.9.008 (released October 12th, 2017) -- Summary of Version 0.9.008 (released 10/12/2017)
- Version 10.0.0 (released October 18th, 2017) -- Summary of Version 10.0.0 (released 10/18/2017)
- Version 10.0.01 (released December 10th, 2017) -- Summary of Version 10.0.01 (released 12/10/2017)
- Version 10.1 (released August 6th, 2018) -- Summary of Version 10.1 (released 8/6/2018)
- Version 10.1.1 (released August 30th, 2018) -- Summary of Version 10.1.1 (released 8/30/2018)
- Version 10.1.2 (released November 15th, 2018) -- Summary of Version 10.1.2 (released 11/15/2018)
- Version 10.2 (released October 7th, 2021) -- Summary of Version 10.2 (released 10/7/2021)