Radio buttons work well when there are only a few options. When you get past a dozen or so options, you’ll probably want to use a pop-up menu or Text List Object instead.
Start by dragging a pop-up menu object from the Object Library to the form. Then enter the name of the field or variable that will be linked to the pop-up menu. Finally, switch to the Formula panel and enter the menu choices, separated by commas (you can optionally include spaces, as shown below). To save time, I preloaded the menu choices into the clipboard.
For a basic pop-up menu, that’s it … you’re done!
If you want separator lines in the menu, just use (-
in any spot where you want a separator line.
The examples shown so far have been fixed menus – menus that never change. If you need a pop-up menu that can change dynamically, switch the object to Formula mode.
In this mode, the Formula panel actually contains a formula, instead of a comma separated list. Here is the revised formula for our National Park example. Notice that now each national park is on a separate line, and also note the quote characters at the beginning and end, which are necessary to make this a valid formula.
One minor advantage of this mode is that it allows menu choices to contain commas, which isn’t allowed in the Comma Separated Values mode. But the real power of Formula mode is unleashed when you use a variable or field in the formula. Since the variable or field may be changed at any time with a procedure (or even with standard data entry), the pop-up menu can change at any time. For example, suppose you want to make the national park menu user editable. I can create a Text Editor Object linked to a variable named NationalParkNames, like this:
Then I can change the pop-up menu formula to this same variable name.
Now the pop-up menu name can be edited on-the-fly.
In this example, the formula is very simple, just a single variable, but you can use as complex a formula as you need.
If you want to go the full Monty, you can create a fully custom menu with the menu( and menuitem( functions (see Custom Menus. With these, you have full control over the menu, including styles, colors, images, icons, checkmarks, submenus, etc, like this:
Here is the formula for this menu.
To learn how to design complex menus with these functions, see Custom Menus.
If your formula has a problem it can be a bit tricky to figure out what’s wrong since you can’t directly see the text produced by the formula. In that situation you can use the Object Value dialog to display the entire formula result. See Diagnosing a Formula embedded in a Form Object to learn how to use this dialog.
Click on the magic panel to see and modify the pop-up menu options:
Data – This is the field or variable that is linked to the pop-up menu. You can either type in the name of a field or variable, or you can choose a field name from the pop-up menu (on the right). Panorama will also auto-complete field names as you type.
When you select a choice from a pop-up menu, that choice will be be placed into the linked field or variable. Of course the value of a field or variable can also be set other ways, for example with an assignment statement in a procedure. This code will work with the pop-up menu shown in earlier examples to change the displayed national park to Grand Canyon.
parkName = "Grand Canyon"
showvariables parkName
There is a problem however, if the new value is not one of the available choices in the menu.
parkName = "Petite Canyon"
showvariables parkName
If the value is not a menu choice, the value will not be displayed. Instead, the pop-up menu will be blank.
The reason the pop-up menu is blank is that Panorama uses standard Apple pop-up menu code, and Apple’s code will only display values that are included in the menu. See Cocoa Objects for more information about why Panorama uses standard Apple code, in spite of some restrictions like this.
Note: If you specify a variable that has not already been created with a procedure, Panorama will automatically create a global, fileglobal or windowglobal variable with this name the first time the form is displayed. The type of variable created depends on the Form Preferences.
Data Source The data source is usually a field or variable, but you can also use a formula. See Using a Formula as the Popup Menu Data Source below to learn more about this option.
Size – Popup menu buttons may be one of three fixed heights: Regular, Small and Mini.
These are the only sizes available – see Cocoa Objects for more detail about the reasons for this limitation.
System Font – If this option is checked, the popup menu will always be displayed using the standard system font and font size. Uncheck this option if you want to use a non-standard font or size (in which case you select the font and size from the Text panel, see Fonts).
Transparent – If this option is checked, the button will be completely transparent (the title will also be hidden). This is handy if you want to put the button on top of other graphics, however, see Using Any Type of Object as a Pop-up Menu below for an alternate method for doing this.
Disabled – This option disables the button. When the button is disabled it is dimmed and it can’t be clicked on.
Of course there is no point in a button that is permanently disabled. So normally you would enable/disable a button with a procedure. See {Push Button Objects for an explanation of how a procedure can enable/disable a button.
Using the popupclick statement and a few lines of code, Panorama X allows any type of object to be converted into a pop-up menu. In this example, the button was created with the Font Awesome Icons wizard.
When the icon is clicked on, it runs the code which pops up the menu.
In older versions of Panorama (6 and earlier), a custom pop-up menu like this would have to be created by layering two objects on top of each other – an image and a transparent button. Now only a single object is needed.
Panorama usually automatically links the pop-up menu to a database field or a variable. The pop-up menu automatically displays the contents of the field or variable in the pop-up menu, and automatically updates the value of the field or variable when a selection is made from the popup menu. In some cases, however, the value may not be in a field or variable. For example, the value might be in a preference value (see getpreferencevalue(), in a file on disk, or might need to be calculated on-the-fly somehow. To do this, change the Data Source to Formula and type in the formula into the Data box. (Note: This formula, which is used for the data value, is separate from the formula described above for creating the menu choices. In other words, a popup menu object can have two different formulas – one for the menu choices, and another for the data value.)
Here is an example that uses the preference value PXErrorDisplay as the data source. (If this preference value hasn’t been set yet, the formula defaults to displaying Alert in the popup menu.)
When the user makes a selection with this popup menu, Panorama doesn’t have a field or variable to put the selected value into. So instead, it puts the selected value into a fileglobal variable named PopupMenuResult (if this variable doesn’t already exist, Panorama creates it). It’s up to you to write code that takes this value and stores it somewhere. Here’s code that stores that value into the PXErrorDisplay preference value:
In addition to storing the value, this code needs to make sure that the display of the popup menu is refreshed with the new value. In this example, this is done with the variable exFresh. The second line of the code above tells Panorama to refresh any object that contains this variable. Looking back to the data formula for this object, you’ll notice that it contains this variable inside a catcherror( function.
catcherror("",exFresh)+catcherror("Alert",getpreferencevalue("PXErrorDisplay"))
This variable doesn’t contain anything, in fact it doesn’t even exist! So that part of the formula doesn’t display anything. But even though the variable doesn’t exist, Panorama will still update the display when you use the showvariables statement in your code.
showvariables exFresh
You could of course set up an actual variable in advance, then you wouldn’t have to use the catcherror( function. But since the variable isn’t actually needed for anything else, you may find the technique shown here simpler to use. (You could use any variable name you want, it doesn’t have to be exFresh, just make sure that you consistently use the same name in the data formula and the code.)
See Also
History
Version | Status | Notes |
10.2 | Updated | Now allows the data value to be determined by a formula (as an alternative to being linked to a database field or variable). |
10.0 | Updated | Carried over from Panorama 6.0 from Popup Menu SuperObjects, but with some new features. This version of Panorama only supports standard system button styles, so some button styles that were available in previous versions of Panorama are no longer available. |