This version must be manually downloaded and installed (as I expect for all beta downloads for the forseeable future). Here is the download link.
http://www.provue.com/downloads/sparkle/PanoramaX/3410/PanoramaX.zip
Once again there is a lot of new documentation – in fact there are 67 new help topics (probably 150-200 new pages). Here are the highlights.
The 10.2 release notes include both this beta and all of the earlier ones.
To learn about what’s new in this b7 release, the detailed changes are described below. As you will see, there are many new features and even more bug fixes.
- Many times multiple separate databases are required to accomplish a database task. For example, if you are working with an Invoice database, perhaps you also need to have the Inventory, Customer List and Price List databases open. You can now configure Panorama to open these auxiliary databases automatically with the Auxiliary panel of the File>Database Options dialog sheet. Once this panel is set up the additional databases will open automatically whenever the primary database is opened, no additional code is needed.
- The new View Search wizard facilitates comprehensive searching of procedures and forms. This is similar to the Open View dialog, but allows search windows to stay open as long as you like, and to perform multiple searches at once.
- The new Debug Instrumentation feature enables conditional logging of the internal state of Panorama program code for rapid debugging. The instrumentation control panel (shown below) allows the granularity of logging to be controlled at the level of individual procedures. This means that the code to necessary for outputing debug information can be left permanently in production code, but selectively enabled only when trying to diagnose a problem. This granularity lets you keep clutter in the log to a minimum, improving performance and making the log easier to analyze.
- When the Instrumentation panel is enabled, you’ll also see a new Instrumentation menu at the end of the menu bar. This menu is displayed with a microscope icon. The top item in this menu provides quick access to the Instrumentation panel. The other items provide quick, universal access to features in the Instrumentation panel withough having to actually open that panel.
-
Instrumentation has been added to some Objective-C code, which can be enabled from the Instrumentation panel. Normally this would only be done following instructions from ProVUE Development technical staff.
-
Added an instrumenation option to control whether logging occurs while Panorama is starting up. The default is no logging during startup.
-
If you are managing a fleet of computers that needs to run Panorama X, Panorama now provides a mechanism to save a standard configuration and then quickly duplicate that configuration on other computers via a link. You can also include account credentials in the link, so that a new computer can be configured for use with Panorama with a single click! See Deploying Panorama in an Organization to learn more about this option.
-
All windows now have a unique numeric ID. This allows code to reliably reference a particular window, even if that window has been renamed. For an overview of this new feature, see Window ID Numbers. The window statement and windowinfo( and windowglobalvalue( functions have been updated to allow windows to be specified by ID number. The new functions info(“windownumber”), info(“windownumbers”), info(“datasheetwindownumbers”), info(“formwindownumbers”), info(“procedurewindownumbers”) and listwindownumbers( functions return ID numbers. The getformoption( and getprocedureoption( functions have been updated to optional return window number ID’s. The new function info(“clickedwindownumber”) returns the number of the window the mouse was clicked in (which may be different from the active window). The new info(“dropwindownumber”) function is used to find out what window a drag and drop operation wound up on. Finally, the magicwindow statement now allows a window number to specify the window, as an alternate to the window name.
-
If a database contains an
.Initialize
procedure, that procedure now runs immediately when a database is opened. If a database is opened by code, the code following the opendatabase or openfile statement doesn’t run until after the.Initialize
procedure is finished (this is different than in versions 10.0 and 10.1, where the.Initialize
code wouldn’t run until after the code in the original procedure). You can now even put an alert or dialog in the.Initialize
procedure, though that is still not considered a best practice. If an.Initialize
procedure encounters a runtime error, a notification will appear, but any code following the opendatabase/openfile statement will still run normally. Finally, the.Initialize
procedure is now documented in the Custom Database Initialization help page. -
The opendatabase statement now works correctly when opening a shared database. Panorama completes all server connection tasks before continuing with the code after the opendatabase statement. Also, the
.Initialize
procedure (if any) now runs after the server connection is complete but before any code following the opendatabase statement. -
The views( function has a new option, viewtypes, which restricts the output to specified types of views, either procedures, forms, or data sheet.
-
Panorama now includes a new Global Dictionaries feature for high performance dictionary applications. The new global dictionaries are much faster than the existing data dictionary feature (however, they are more inconvenient to use). New statements: SetGlobalDictionaryValues, DeleteGlobalDictionaryValues. New functions: GlobalDictionaryValue(, GlobalDictionaryKeys(, GetGlobalDictionary(.
-
The new procedureexists( function provides a fast an easy way to check to make sure that a procedure exists, as you might want to do before attempting to call it.
-
New labelize( function saves double typing of field/variable names when displaying a field or variable in a log or message.
-
The new openasyncprogresswindow statement makes it super easy to display a progress window for long running tasks like downloading large files from the internet. It’s designed to be paired with the urltask( function, but can also be used with timers.
-
When merging a field into a Text Display Object or Web Browser Object, for example
«field»
, Panorama now uses the output pattern for that field, instead of just default str( conversion (if an output pattern has been set up). -
Multiple changes have been made to the protocol used by the
..PostSynchronize
procedure (if present, this procedure is called during client synchronization. If you have a database with this procedure, you may need to make adjustments (see [synchronize]). First of all,..PostSynchronize
is now always called, even if no records were downloaded. The second change is that..PostSynchronize
is now called with a dictionary instead of 4 separate parameters. The final change is that synchronization no longer displays a notification if there is a..PostSynchronize
procedure, in that case, the..PostSynchronize
procedure must display the notification itself (the default notification message is passed in the dictionary if you want to use it, or you can customize your own message). -
When importing or exporting CSV text files, Panorama now uses semicolon (
;
) as the default field separator if the system preferences are set to use a comma as the numeric decimal point (for example in much of Europe). -
New runningappinfo( function returns information about a specific app currently running on the computer, or all running apps. This function is very fast, much faster than using a shell script to perform the same task. The new Instruments panel uses this function to check to see if Console.app is running.
-
New croptext( function, cuts off text if it is too long, adding ellipsis to indicate that it is cut off.
-
New ability for a subroutine to access and modify the local variables of its caller, using the callerslocalvariablevalue( and info(“callerslocalvariables”) functions, and the setcallerslocal statement. Use this new unstructured capability with care.
-
Fixed multiple significant bugs in the copyfile statement. 1. It now checks to make sure that the destination folder is writeable. 2. It now creates the destination folder if it doesn’t already exist (as Panorama 6 did). 3. It now replaces the destination file if it already exists (as Panorama 6 did).
-
Fixed multiple significant bugs in the copyfolder, copynewerfile and copynewerfolder statements, and added a new copynewerfile( function. The folder copying statements now have the ability to filter the list of files being copied, and to report the progress of the copy back to the calling program.
-
Added new wait and ExecuteASAP statements to facilitate running code with a slight delay. The new info(“runningatomic”) function checks to see whether or not code is using the normal run loop. Code that runs outside of the run loop is now called Atomic Code instead of …Handler code. There is now an extensive explanation of how Panorama code interacts with the run loop in Understanding the Run Loop.
-
The new waitfortask and resumeaftertask statements facilitates coordination between synchronous and asynchronous code. The new setwaitinglocal statement allows asynchronous code to pass data back to the synchronous code that spawned it. The urltask( function now converts any
«taskid»
tags in the source code into the actual task id, for use with the resumaftertask and setwaitingglobal statements. -
A new preference option in the Client preferences panel allows customization of the timeout when clients contact the server (previously the default was 60 and could not be changed).
-
Fixed a bug that could sometimes prevent the Wifi icon from appearing in the toolbar of a shared database after synchronizing.
-
Fixed client/server operation when a client database has no visible windows (secret). In particular, synchronizing and opening secret shared databases now works.
-
Any code after a synchronize statement now waits to execute until the synchronization is complete.
-
A new preference setting in the Client preferences panel controls whether the user is prompted when a new generation of a database is available. The new default is to simply install the new generation without asking for confirmation.
-
The File menu now includes server commands (connect/disconnect, synchronize, download from server, etc.) even when the user doesn’t have access to standard UI elements.
-
The Server Administration wizard now allows you to force a record to unlock manually.
-
New forceunlockdatabaserecord statement that can unlock any record in any open database on the server.
-
Fixed logic for locking a record when it was already locked but the session that owned the lock is gone (normally would only happen after a crash, force quit, or bug).
-
Improved error handling in the forcelockrecord and forceunlockrecord statements.
-
Fixed problem that could cause saving on the server to fail.
-
Fixed problems that could sometimes occur when downloading a new database generation (during openfile). Also improved the performance of downloading a new generation.
-
Now ensures that correct client database is active after downloading sync information from server.
-
Fixed problem that sometimes caused the server to keep databases open after they were supposed to be closed.
-
When starting or stopping the server, the Start/Stop button is now disabled during the transition, so it can’t be accidentally clicked during this transition.
-
Added the CheckServerConnection statement, which was available in Panorama 6 but had been left out of Panorama X so far.
-
The partialdatabaseupdate statement now updates the view and action menus if the procedures or forms were updates. This also fixes new database generations so that they immediately show any changes to forms and procedures in the menus.
-
The formulamerge statement now handles formula errors properly.
-
The dumpdictionaryquoted( function now outputs any binary values in the dictionary as
[[[BINARY DATA]]]
(instead of spewing out a bunch of random looking garbage). -
Fixed floating point fields to allow values with more than one place in front of the decimal point. For example, 12.34 was rejected as invalid, while 1.234 was allowed. Now both are ok.
-
The val( function now works with fractional values even when the system’s decimal point is set to a comma (for example 1,23). Also, the val( function now has an optional second parameter that allows you to explicitly specify the decimal point character.
-
The SetPermanentVariable statement no longer fails if the value parameter is a single token (i.e. a single field or variable).
-
Panorama’s JSON export functions now use
"
instead of'
as quote character. According to the spec either are ok, but Apple’s JSON parser doesn’t like the single quotes. -
The new closeclonewindow statement is an alternate method to close the current window, it will work even if the window doesn’t have a close box.
-
Open database (and partial database update) now abort if there is an error decoding the property list (there is no reason to think this has ever happened, but theoretically it could).
-
Since the single step feature doesn’t work reliably, the single step tool has been removed from the default tool bar configuration.
-
Added documentation for the info(“loggedinaccountrole”) and info(“loggedinaccountemail”) functions.
-
Panorama now checks for an error when checking the computer’s MACID for when setting up the account. (This change was made after a user encountered an error due to a bad ethernet port in his Mac Mini, so that he could not log on to Panorama X on that computer.) If there is an error, it now uses the MACID of the alphabetically first network interface. It is also possible to force a specific network interface. There is also a new function that returns the MACID of the network interface that is registered with Panorama, the panoramamacid( function. See the documentation of this function for details on customizing what network interface is used.
-
In the Relational Workshop wizard, clicking on the green thumbs up icon in the Lookup Results panel no longer displays a blank alert (or any alert). If there is a red thumbs down icon, it still displays the error message.