Version 0.1.016 (released October 12th, 2015)
Implementing channels took the most time, nearly a week. This release also includes many small changes made in preparing the Keynote slides for upcoming sessions.

- Reduced size of Panorama.app by nearly 80%. Your databases may get a bit smaller also if you have large procedures (you’ll need to recompile them).

- Implemented channels, including preference panel for channel settings, channel statements and functions, and statements for dialing the phone and sending email.

- New tags for the ConstructFormDataEditors statement, including `<width>`, `<button>`, `<buttons>`, `<help>` (tooltips) and `<code>`.

- New “Large Text” Formula Workshop window.

- New Recompile statement, and added recompile option to View Organizer wizard.

- Find/Select dialog is empty/is not empty options now work with any data type.

- Fixed missing information in form blueprints, including static images, groups, and text labels.

- The arraycontains( and arraynotcontains( functions now work with data arrays.

- The GetDictionaryValue( function and statement now have an additional optional parameter that specifies a default value to return if the dictionary item doesn’t exist.

- SetDictionaryValue statement now allows multiple key/value pairs to change multiple values with a single statement.

- The timestampstr( function now works correctly for all times of day.

- Fixed bugs in Perl, PHP, Python and Ruby statements. Most of these bugs had already been fixed for Perl, but the fixes had not been applied to the other languages.

- Fixed crash that occurs when importing a Panorama 6 database with no permenent variables

- The listfiles( function will now accept one 4 character type code, in addition to 1 or more 8 character type codes.

- Numerous documentation corrections submitted by Crag McPherson – thank you Craig!

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

- channelcatalog -- The channelcatalog statement creates a list of all channel databases (including the path for each database).
- crtolf( -- The crtolf( function converts carriage returns into linefeeds.
- divzeroerror( -- The divzeroerror( function divides two numbers, returns an error if the denominator is zero.
- infinity( -- The infinity( function returns infinity.
- lftocr( -- The lftocr( function converts linefeeds into carriage returns.
- recompile -- The recompile statement recompiles all procedures in a database.
- signedbinaryvalue( -- The signedbinaryvalue( function converts binary data (a byte, word, longword, or longlongword) into a signed number (see Binary Data).

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

- channelcall -- The channelcall statement calls a procedure in the active channel module.
- channelpath -- The channelpath statement returns the path of a specified channel module.

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

- channelactivemodule( -- The channelactivemodule( function returns the currently active module for a channel, if any.
- channelactivemodule -- The channelactivemodule statement returns the currently active module for a channel, if any.
- channelgetdictionary -- The channelgetdictionary statement returns the current settings for a specified channel.
- channelinformation( -- The channelinformation( function returns information about a specified channel.
- channelinformation -- The channelinformation statement returns information about a specified channel.
- channelload -- The channelload statement loads a channel module.
- channelmodules( -- The channelmodules( function returns a list of available modules for a specified channel type.
- channelmodules -- The channelmodules statement returns a list of available modules for a specified channel type.
- channelopen -- The channelopen statement opens a channel module for editing.
- channelpath( -- The channelpath( function returns the path of a specified channel module.
- channelprocedures -- The channelprocedures statement returns a list of procedures available in a specified channel.
- channelswitch -- The channelswitch statement switches the active channel module.
- channeltypes( -- The channeltypes( function returns a list of available channel types.
- channeltypes -- The channeltypes statement returns a list of available channel types.
- dialdigits -- The dialdigits statement dials one or more digits.
- dialphone -- The dialphone statement dials one or more digits, adjusting for area codes, country codes, etc..
- sendarrayemail -- The sendarrayemail statement sends a single e-mail to multiple recipients.
- sendbulkemail -- The sendbulkemail statement sends a single e-mail to multiple recipients.
- sendemail -- The sendemail statement sends an e-mail. It gives access to the maximum number of options available.
- sendoneemail -- The sendoneemail statement sends a single e-mail to a single recipient.

ALL features that were added or changed in this release:

- / -- The / operator divides one numeric value by another.
- channelactivemodule( -- The channelactivemodule( function returns the currently active module for a channel, if any.
- channelactivemodule -- The channelactivemodule statement returns the currently active module for a channel, if any.
- channelcall -- The channelcall statement calls a procedure in the active channel module.
- channelcatalog -- The channelcatalog statement creates a list of all channel databases (including the path for each database).
- channelgetdictionary -- The channelgetdictionary statement returns the current settings for a specified channel.
- channelload -- The channelload statement loads a channel module.
- channelmodules( -- The channelmodules( function returns a list of available modules for a specified channel type.
- channelmodules -- The channelmodules statement returns a list of available modules for a specified channel type.
- channelopen -- The channelopen statement opens a channel module for editing.
- channelpath( -- The channelpath( function returns the path of a specified channel module.
- channelpath -- The channelpath statement returns the path of a specified channel module.
- channelprocedures -- The channelprocedures statement returns a list of procedures available in a specified channel.
- channelsetdictionary -- The channelsetdictionary statement saves new settings for a specified channel.
- channelswitch -- The channelswitch statement switches the active channel module.
- channeltypes( -- The channeltypes( function returns a list of available channel types.
- channeltypes -- The channeltypes statement returns a list of available channel types.
- crtolf( -- The crtolf( function converts carriage returns into linefeeds.
- dialdigits -- The dialdigits statement dials one or more digits.
- dialphone -- The dialphone statement dials one or more digits, adjusting for area codes, country codes, etc..
- divzeroerror( -- The divzeroerror( function divides two numbers, returns an error if the denominator is zero.
- encodebase64( -- The encodebase64( function encodes data using Base64.
- formcolor -- The formcolor statement changes the background color of the current form.
- getaddress -- The getaddress statement divides the last line of an address into separate components.
- getinternalbutton -- The getinternalbutton statement retrieves the coordinates of the last button that was pressed (in form relative coordinates).
- getlocalbutton -- The getlocalbutton statement retrieves the coordinates of the last button that was pressed (in window relative coordinates).
- getname -- The getname statement divides a person's full name into separate components.
- gettextdialog -- The gettextdialog statement displays a configurable modal dialog that asks the user to enter an item of text.
- getwebcolor -- The getwebcolor statement will calculate an RGB color from a Netscape style web color.
- gotofielddialog -- The gotofielddialog statement opens the standard dialog for jumping to a specific field (in the Fields menu).
- htmldatamerge -- The htmldatamerge statement uses a template to generate HTML you want from a database.
- importjsonline -- The importjsonline statement imports a JSON record into the current record.
- infinity( -- The infinity( function returns infinity.
- info("guid") -- The info("guid") function returns a unique identifier string.
- info("timerinfo") -- The info("timerinfo") function returns a dictionary that contains all of the properties of the currently running timer.
- insertbelowcarriagereturn -- The insertbelowcarriagereturn statement inserts a new record below the current record and moves to the first column.
- lftocr( -- The lftocr( function converts linefeeds into carriage returns.
- listpanoramafiles( -- The listpanoramafiles( function returns a list of panorama database files in the specified folder.
- local -- The local statement creates one or more local variables.
- makefilesecret -- The makefilesecret statement closes all of the windows associated with a file, but keeps the file open in memory.
- md5( -- The md5( function calculates the MD5 hash of a binary or text data item.
- sendemail -- The sendemail statement sends an e-mail. It gives access to the maximum number of options available.
- sha256( -- The sha256( function calculates the SHA-256 hash of a binary or text data item.

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.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.029 (released December 31st, 2016) -- Summary of Version 0.1.029 (released 12/31/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)