Using the Editors


Chapter 8 . Defining Widget Behavior

By default, Panther controls much of how widgets behave—each widget type having its own unique behavior. However, this chapter describes those attributes, via the Properties window, that allow you to control the way a widget behaves, such as:


Identifying and Naming Widgets

Panther automatically assigns internal field numbers whenever you add a widget to a screen. However, to maintain maximum control of what happens on a screen at runtime and facilitate field referencing in programming, assign a name to each widget on a screen—under Identity, in the Name property.

The widget's name appears at the top of the Properties window when the widget is selected. You can also see the name (and number) assignments for all widgets on a screen by viewing the Widget List.

Figure 8-1 Provide widgets with easy-to-identify names to facilitate referencing them programmatically.

Panther automatically numbers each object on a screen as follows:

Referencing by field name is generally safer than referencing field numbers, because field numbers can change each time the screen is changed; for example, when a record is inserted.

Assigning a Widget Name

A widget name identifies a field on the screen. The name must be unique; that is, no other widget or group on the screen can share the name. Individual array occurrences are referenced by widget name and occurrence number. Widgets that are created as the result of importing database tables are automatically named after the database column with which it is associated.

How to Assign a Name to a Selected Widget

Names can be up to 31 characters long, and must start with an alphabetic character, an underscore, a dollar sign, or a period. The rest of the name can contain alphanumeric characters, underscores, dollar signs, and periods. The names are case-sensitive; therefore, a widget named city is different from a widget named City.

Use the widget name to refer to a widget both within the screen editor (e.g., to specify the Next Tab Stop property) and in application code. In addition, a widget must be named if:

When you copy a widget within a screen, the copy retains all properties of the original except the name—otherwise a duplicate name would result. The new widget has no name.

When you copy a widget from one screen to another, the widget name is copied as well. Widgets on different screens can share the same name, but it is good practice to share names only when the widgets will share the same data or properties. In that way, data can be shared through the LDB, and properties can be inherited from the repository, respectively.

Assigning a Mnemonic

You can identify which character on a widget's label is treated as the widget's mnemonic. The mnemonic provides users with an alternative way of activating or bringing focus to a field, or related field, if the widget is protected. The following rules apply when you assign a mnemonic:

The mnemonic is designated as one of the characters in the widget's label. For example, if you have a check box on the screen with the label New Movies, you can specify any of its letters or a position as the mnemonic. You can specify upper case N or lower case w, or position 1 or 3, respectively. In this example, upper-case N defines the first letter in the string to be underlined (or displayed in a contrasting color in character mode), lower-case w defines the third letter in the word New to be designated as the mnemonic.

How to Identify the Keyboard Mnemonic on a Widget
  1. Select the widget.
  2. Under Identity, enter a label in the Label property.
  3. Under Identity in the Mnemonic Position property, enter the letter or a numeric position to be identified as the access key.

    The property setting returns the position of the character in the label. For example, if you enter the mnemonic A for a push button with the Label property setting Add, the Mnemonic Position property is defined as 1 \QA'—the first character in the Add label.

Using Mnemonics

You can always activate a widget mnemonic from a non-data entry field, such as a radio button or toggle button, by pressing the mnemonic key by itself. If a data entry field has focus, you can activate a menu bar or widget mnemonic by pressing the Alt and mnemonic keys together. In Windows and character mode applications, the screen's menu bar is searched for an active item that uses that mnemonic; if none is found, the mnemonic is sought among the widgets on the current screen. In Motif applications, only menu bar items are searched.

Specifying the Widget's Data Type

When you import database tables, the widgets that represent the table's columns are automatically assigned a data type by Panther. For the most part, the C Type property does not affect the look or behavior of the widget in your application. For example, a C Type property (under Identity) set to Double, with the Precision property set to 3, does not set or effect a widget with a numeric property specification or perform any validations when the user enters data into the field.

You can use the C Type property to control the way Panther formats data before passing it to a database (refer to "Colon Preprocessing" in Application Development Guide for information). In this way, you can specify the database format as opposed to Panther's format.

Possible C type values are: Default (two decimal places), Omit, Char String, Int, Unsigned Int, Short Int, Long Int, Float, Double, Zoned Dec, Packed Dec, and Hex Dec.

The Omit specification means that the field should be omitted from the data structure.

If you select Float, Double, Zoned Dec, or Packed Dec, you can also specify the Precision property. The default is 2 decimal places.

You can also define zoned and packed decimal types to be either signed or unsigned. In the Sign property, enter Yes to indicate signed; enter No for unsigned.


Invoking a Popup Menu

A popup menu is a vertical menu bar. The menu bar that appears on the current screen can be accessed as a popup menu by clicking the right-mouse button. The popup menu appears at the current mouse cursor position.

How to Invoke a Popup Menu for a Widget or Specific Widgets

  1. Select the widget or widgets.
  2. Under Help, enter the menu name in the Popup Menu property.

    The specified menu must be in a script that is already loaded in memory. Panther checks the screen-level location first, and then application-level for the named menu.

    At runtime, when a user clicks the right-mouse button on the widget, the specified popup menu is displayed. If the widget's Popup Menu property is unspecified, the screen's menu bar is displayed as the popup.

  3. To load a popup menu script into memory, under Help in the Popup Script File property, enter the filename or choose More to select the file (*.mnu) from the Select Library Member dialog box.

    If you do not supply a name in the Popup Menu Name property, Panther displays the first menu in the specified script.


Active Versus Inactive Widgets

Active widgets can get focus and respond to user-generated actions. Their appearance indicates that they can be selected or pressed. Widgets that can be made inactivate, or temporarily deactivated, are those that have a label—specifically, push buttons, toggle buttons, radio buttons, and check boxes.

You can inactivate specific widgets in a selection group. You must set the Active property under Identity to No for all members of the group to make the group inactive.

How to Initialize a Widget's State

  1. Create or select the widget (dynamic label, push button, toggle button, radio button, or check box).
  2. Under Identity, specify the widget's initial state in the Active property.

If you define that a dynamic label be initially inactive, consider deactivating its corresponding data entry widget (if one exists) at the same time. Under Focus, set the Focus Protection property to Yes for the data entry widget.

How to Change a Widget's State at Runtime

For information on accessing and setting a widget's property values programmatically, refer to "Properties" in Application Development Guide.


Protecting Widgets

Some widgets, by default, are protected and can only be unprotected at runtime via library functions. For example, dynamic labels are protected from getting focus; the user cannot type data directly into a dynamic label.

There are four types of protection properties available. You can set one or more of these on a widget.

Focus Protection

When a widget has focus protection, at runtime the user cannot Tab, mouse click, or arrow into the field. However, you can use library functions, for example, sm_gofield to move the cursor into the field.

You can set focus protection for the following widget types:

How to Control a Widget's Focus Protection

  1. Select the widget.
  2. Under Focus, set the Focus Protection property accordingly.

Validation Protection

Validation occurs under the following circumstances:

You can set validation protection for all widget types except static and dynamic labels and graphics widgets (including lines and boxes).

How to Protect a Field from Being Validated When the User Exits the Field

  1. Select the widget.
  2. Under Validation, set the No Validation property accordingly.

Input Protection

When a widget is protected from input, the field rejects all characters that the user types, issuing a beep. The CLR, FERA, DELE, DELL, and INSL keys do not work in fields that are protected from input.

The Input Protection property can be set for the following widget types:

How to Control Data Entry to a Widget

  1. Select the data entry type widget.
  2. Under Input, set the Input Protection property accordingly.

Clearing Protection

A field is protected from clearing if any of the following occur:

There are library functions that you can use to clear screens and fields at runtime; however, widgets that are protected from clearing are not affected.

The Clearing Protect property can be set for the following widget types:

How to Define Whether a Widget's Data Can Be Cleared or Not

  1. Select the widget.
  2. Under Input, set the Clearing Protect property accordingly.

Double-Click Events

A double click event occurs when the user quickly presses and releases the mouse button twice while over the following widget types:

To make something happen when the user double-clicks on a widget, you assign a control string to the widget.

How to Assign a Double-Click Event

  1. Select or create the widget.
  2. Under Validation, enter the control string in the Double Click property. Refer to Chapter 18, "Programming Control Strings," in Application Development Guide for details on control string syntax.

At runtime, when the user double-clicks on the widget, the control string is executed. The control string causes one of the following actions or events to take place:


Setting Tabbing Order

Tabbing order refers to the order in which the cursor moves from field to field in response to the TAB and BACK (Backtab) keys or when a character is entered into the last position of a field that has the Autotab property set to Yes. (Refer to "Autotabbing" for an explanation of auto tabbing.)

The cursor can only move to tab-accessible fields; that is, those widgets that have the Focus Protection property set to No. However, if widgets that are focus-protected have specifications for the tabbing order (in the Next Tab Stop or Previous Tab Stop properties), those specifications affect the tabbing order.

Forward Tabbing Order

The forward tabbing order is the order of cursor movement when the user presses Tab or when auto tabbing occurs. By default, the forward tabbing order is left to right, and top to bottom. This corresponds to the way Panther internally numbers widgets on a screen.

Backward Tabbing Order

The backward tabbing order is the order of cursor movement when the user presses the BACK key. By default, the back tabbing order is the reverse of the default for ward tabbing order—that is, right to left, and bottom to top.

Changing the Tabbing Order

You can change the tabbing order in two ways:

How to Define the Tabbing Order for a Widget or Group

  1. Select the widget or group (from the Widget List).
  2. Under Focus in the Next Tab Stop and/or Previous Tab Stop properties, enter the name of the widget or group that should be accessed when the user tabs or backtabs out of the selected object. Choose OK and the Alternate Tab Stop subproperty is displayed.

    The Next Tab Stop property controls where the cursor goes next when the user presses the TAB key (or as a result of auto tabbing) in the current field. Panther uses the default forward tabbing order to position the cursor when no Next Tab Stop is defined.

    The Previous Tab Stop property controls where the cursor goes when the user presses the BACK key while in the current field. Panther uses the default backward tabbing order to position the cursor when no Previous Tab Stop is defined.

  3. (Optional) In the Alt Tab Stop property, enter the name of the widget or group that should be accessed in the event that the named object you identified as the Next/Previous Tab Stop does not exist at runtime.

Specifying Tab Stops

The following steps illustrate how to specify a tab order from widget A to widget B:

  1. Select widget A.
  2. Under Focus in the Next or Previous Tab Stop property, enter widget B's name (the name is case-sensitive, so enter the name exactly as specified in its Name property).

    Note: You can also specify a widget's field number, although field numbers should be used with caution since field numbers can change if you move a widget.

    Use the Widget List to find widget B's name or select widget B on the screen; its name appears in the Widget field at the top of the Properties window. If a field number displays, you can name the widget—in the Name property under Identity.

Using a Field Number

If you specify a field by number, rather than the widget's name, precede the number with a # (pound) sign. For example, #12 refers to field number 12.

You can use relative referencing to refer to a field relative to the current field. Precede relative references with a plus or a minus sign. The field just before the current field is -1. The fifth field following the current field is +5. To refer to the current field, use +0 or -0. Using a widget name and relative referencing is not a valid designation; i.e., usr_id +2.

The following are all valid settings for Next or Previous Tab Stop property settings as well as their Alt Tab Stop settings:

#23

specifies field #23

+12

specifies the 12th field after the current widget

-4

specifies the 4th field preceding the current widget

Specifying an Occurrence

You can designate a particular occurrence in an array by appending the occurrence number in square brackets to the widget's name or field number. The occurrence number can be absolute or relative.

If you specify an array without giving an occurrence number, the cursor is positioned in the designated array at the same occurrence number it was in when it left the previous array. For example, if the cursor is currently in item[3] and the next tab stop is unit_price, tabbing out of the current field, specifically item at its third occurrence, will move the cursor to unit_price at its third occurrence, unit_price[3].

If the current field is not an array, the cursor moves to the first occurrence of the designated array.

The following are all valid designations for specifying a particular occurrence in an array as the Next or Previous Tab Stop:

title[4]

specifies 4th occurrence in the widget title

title

specifies the array widget title; cursor moves to the occurrence that matches the occurrence number of the current field

title[-3]

specifies the array widget title; cursor moves to the third occurrence prior to the occurrence number of the current field

Refer to "Element and Occurrence Numbering"in Application Development Guide for more information.

Specifying a Group

If you specify a group name as the next or previous tab stop, at runtime the cursor moves to the first field of the group. To move the cursor directly to a specific member of the group (for example, the nth field of the group), append [n] to the group name. For example, city[3] refers to the third member in the group city.

By default, the cursor does not move when the user makes a selection. Setting the Autotab property to Yes causes the cursor to leave the group once a selection is made.

Changing the Tab Order

This section includes some examples that illustrate how you can control the tab order.

In Horizontal Arrays

By default, when TAB is pressed in a widget defined as a horizontal array, the cursor moves from left to right in the array. In Figure 8-2, the top portion of the screen illustrates the default tabbing order when there are two horizontal arrays on a screen: a widget named horiz1 and another horiz2. The cursor tabs through horiz1 before moving to horiz2.

Figure 8-2 The default tabbing order in horizontal arrays can be modified to alternate between the two arrays.

To modify the tab order so that tabbing moves the cursor from top to bottom, and from left to right (as illustrated in the bottom portion of the screen in Figure 8-2):

  1. Select the widget horiz1.
  2. Specify horiz2 (with no subscript) as the Next Tab Stop property setting.

    This means when the user presses TAB while in horiz1, the cursor moves to the same occurrence of horiz2.

  3. Select the widget horiz2.
  4. Specify horiz1[+1] as the Next Tab Stop setting.

    When the user presses TAB while in horiz2, the cursor moves to the next occurrence in horiz1.

In Vertical Arrays

As the top portion of the screen in Figure 8-3 illustrates, the default tabbing order causes the cursor to move from the first occurrence of array1 to the first occurrence of array2, to the second occurrence of array1 to the second occurrence of array2, and so on. Scrolling through the occurrences of an array requires the user to press Enter or the DOWN ARROW key.

Figure 8-3 The default tabbing order for vertical arrays can be modified to cause the cursor to move through one array before moving to the next.

To change the default tabbing order so that the cursor moves through the screen in columns (as illustrated in the bottom portion of the screen in Figure 8-3):

  1. Select the widget array1.
  2. Specify array1[+1] in the Next Tab Stop property under Focus.

    This means that when the user presses TAB, the cursor moves to the next occurrence of the same array. In addition, Panther scrolls an array, if necessary, to make offscreen occurrences visible.

  3. Specify array2[1] in the Alt Tab Stop subproperty that displays under the Next Tab Stop property. This designation instructs Panther what to do when the user reaches the end of array1 (just beyond the maximum occurrence number), where its next field designation will fail.

    The Alt Tab Stop designation causes the cursor to move to the top of the second array, and scroll both arrays so that their first occurrences are displayed in the top field of each.

  4. Select the widget array2.
  5. Specify array2[+1] in the Next Tab Stop property.
  6. (Optional) Specify the name of the field to move to after tabbing through array2 in the Alt Tab Stop property.
  7. (Optional) For both widgets, use the Previous Tab Stop property to make BACK have the opposite effect.

Autotabbing

When a user fills a field to its last position, by default, the cursor remains in the field until the user presses Tab, Enter, or mouse clicks out of the field. You can force the cursor to automatically move onto the next field when a user enters the required data in a field or makes a selection.

The Autotab property can be set for the following widget types:

How to Control Autotabbing

  1. Select the widget or group.
  2. Under Focus, set the Autotab property accordingly.

Synchronizing Scrolling Arrays

Scrolling arrays can be synchronized so that they scroll together. This helps manage related information in table-like screens. Panther automatically synchronizes arrays when they meet either of the following conditions:

You can manually synchronize arrays that do not meet the above conditions by making the widgets members of a synchronized scrolling group. Refer to "Creating and Modifying Synchronized Arrays" for instructions.

Array Behavior

The behavior of synchronized arrays is largely determined by the following rules:

You can also prevent one or more arrays within a synchronized group from deletion and insertion of occurrences by setting the Clearing Protect property to Yes for the array you wish to protect. This lets you synchronize a protected array that contains an unchanging sequence of numbers with an adjoining unprotected array whose data grows and shrinks

Note: Setting an array's Clearing Protect property to Yes does not prevent deletion and insertion of occurrences in the array when it has focus.

Logical Key Behavior

The movement of the cursor from one occurrence to the next in an array occurs as follows:

Automatic Synchronization

If you are accessing arrays with the transaction manager, all the widgets that are members of the same server view must have the same number of occurrences if those widgets are participating in SQL INSERT, UPDATE, and DELETE statements that occur as a result of the SAVE command. Otherwise, the transaction manager displays an error message that it is unable to synchronize the table view.

This automatic synchronization of arrays by the transaction manager is attempted:

Synchronization of arrays is necessary for commands that alter the database—NEW, COPY, and SELECT. If it fails, an error message is displayed. Synchronization of arrays is also attempted for the VIEW command; however, no error message is displayed if it fails.

If you get a synchronization error for the table view and you do not want to change the number of occurrences, you can review the Use In Update, Use In Insert and Use In Select properties for the widgets in the server view. Also, the Synchronization property for a widget can be set to No. However, changing the Synchronization property will not change the way Panther displays data in arrays. Panther fetches the number of rows equal to the smallest number of occurrences for the widgets in a server view whose Use In Select property is set to Yes.

Creating and Modifying Synchronized Arrays

To ensure that arrays are synchronized regardless of where they are on the screen, you can create a synchronized scrolling group. (You do not need to do this for arrays in a grid widget, or for those that are synchronized by virtue of the table view to which they belong.)

How to Synchronize a Set of Scrolling Arrays

  1. Select the arrays.
  2. Ensure that the value set in the Onscreen Rows or Array Size property is the same for all widgets in your selection set (a number in the setting indicates that the setting is the same; three question marks (???) indicate that the setting is different).
  3. If you are synchronizing a group of Multiline Text widgets, ensure that the Word Wrap property (under Format/Display) is set to No.
  4. Choose EditGroupCreateSynchronized Scrolling.

    All selected arrays will scroll together.

How to Change the Size and/or Behavior of a Synchronized Scrolling Group

  1. Select the group by doing either of the following:
  2. Under Geometry, set any of the following properties for the group:

Identifying Members of the Synchronized Scrolling Group

How to Identify All Members of a Synchronized Scrolling Group

  1. Do either of the following:
  2. Choose EditGroupSelect Members. All widgets associated with the synchronized group are selected.

    If you select widgets associated with two or more groups, the Select Group Member dialog box opens. Continue to step 3.

  3. Select the group from the left hand column and choose OK. All members that comprise the group are selected.

Changing Members of a Synchronized Scrolling Group

How to Add a Scrolling Array to an Existing Group

  1. Select all members of the existing group by doing one of the following:
  2. Shift+click to add the desired array to the selection set.
  3. With all the widgets selected that are to be grouped, choose EditGroupUpdate Group Members.

    The existing group now includes the additional arrayed widget.

How to Isolate an Array That is Synchronized Because It Belongs to a Table View or to Table Views Joined by a Server View

  1. Select the scrolling array you do not want to be synchronized.
  2. Under Transaction, set the Synchronization property to No.

How to Isolate an Array That is Part of a Synchronized Scrolling Group

  1. Select members of the group that you wish to keep in the existing group. Do this by either:
  2. With the widgets selected that are to remain synchronized, choose EditGroupUpdate Group Members.

    The group is redefined to include the new set of widgets.

Sorting Data in Synchronized Scrolling Arrays

You can sort data in arrays by specifying a custom sort order function or by calling the C function sm_obj_sort.

Calling sm_obj_sort for a widget in the array will use the order specified in the widget's Sort Order property: Lexicographic, Numeric, Date/Time, or Custom.

If you choose to write a custom function, it must conform to certain requirements. For more information, refer to "Writing a Custom Sort Function."

Using an Alternative Scroll Driver

Panther uses memory-based scrolling by default. If you want to save memory at the expense of speed, you can set up a disk-based scroll driver by writing your own scrolling function. Attach the scrolling function to your arrays via the Alt Scroll Func property.


Performing Calculations and Validating Numbers

You can attach math and check digit calculations to widgets; they are performed at runtime when the field is validated.

Math Expression Syntax

How to Attach a Math Calculation to a Selected Widget

Under Validation, define the math expression in the Calculation property.

You can attach one or more math calculations to a widget; separate expressions with a semicolon. The math expression takes the following format:

[%m.n | %tm.n.] destination_widget = calculation

The square brackets indicate an optional specification. Do not include the brackets in the specification.

The optional size specification is followed by the destination widget designation (e.g., field name or number), an equal sign, and the body of the expression. The optional floating point size specification defines the destination widget.

Table 8-1 Specifications for math calculations

Specification Description

%m

The total number of characters in the output. If no size is supplied, the total length defaults to the length of the destination widget.

n

The number of digits after the decimal point. If no size is supplied, it defaults to the number of decimal places in the destination widget's Numeric format specification; if there is no Numeric specification, default precision is determined by the DECIMAL_PLACES option (defined in a setup file). You can change the setup specification with a runtime call to sm_option.

%t

Forces truncation rather than rounding of the result.

destination_widget

Designates the destination widget by name or by number.

Field numbers must be preceded by a # sign; for example, #12 refers to field number 12.

To refer to the current widget, use #+0 or #-0.

You can use relative referencing to designate a widget relative to the field number of the selected widget. Relative references must be preceded by a plus or a minus sign. The widget just before the current widget is #-1. The fifth widget following the current widget is #+5.

Designate a particular array occurrence by appending the occurrence number in square brackets to the widget name; for example, title[4] denotes the fourth occurrence of the array title. The number can be absolute or relative. If a designated widget is part of an array and the designation contains no occurrence subscript, then the current occurrence number is used as the array index. The current occurrence number is used as an index to fetch the desired value. However, if the current occurrence number is greater than the number of occurrences in the designated array, an error results.

calculation

Can contain numeric constants, widget designations, parentheses, and the arithmetic operations +, -, *, / and ^ (raise to a power). For example:

%8.0 amount = line_item * 12 + 2

flda[2] = (flda[1] - 6.235) / fldb[1]

For more information on operators and expressions, refer to "Data Types, Operators, and Expressions" in Application Development Guide.

Using Functions

There are three special functions that you can use in math expressions:

Check Digit Calculations

A check digit calculation is used to validate a data entry widget (single line text, multiline text, and combo box widgets).

How to Attach a Check Digit Calculation to a Widget

  1. Select the data entry widget that requires the check digit validation.
  2. Under Input, set the Keystroke Filter property to Digits Only.
  3. Under Input, enter the modulus, 10 or 11, in the Check Digit property. Panther supports the mod-10 and mod-11 algorithms. The Minimum Digits subproperty is displayed.

    Note: The source code to the check digit validation function sm_ckdigit is provided and can be modified to support other check digit algorithms.

  4. (Optional) Under Check Digits in the Minimum Digits property, enter the minimum number of digits that must be entered by the user before the algorithm is invoked.

Documenting Widgets

Two properties under Identity in the Properties window help you document the contents of your widgets:

Adding Comments

By including a brief description of your widget, you can provide information to other developers about the widget, its content, and its purpose. This description is displayed when you view the Repository TOC and scroll through each of the repository entries.

How to Add or Edit Comments for Your Widget

  1. Select the widget.
  2. Under Identity, select the Comments property. The Comments dialog box opens.
  3. Do one of the following to enter or edit text:
  4. Choose OK to save the comments and return to the Properties window.

Including Additional Information

How to Include Additional Information for a Widget

  1. Select the widget.
  2. Under Identity, expand the Memo Text subheading. Nine memo lines are displayed.
  3. Type additional information, comments, and specifications that you can't indicate or specify as a screen property.

    At runtime, you can access the widget's Memo Text property to determine what action to take depending on the property's content.


Defining XML Tags for Widgets

As of Panther 5, you can import and export data from a Panther screen to a buffer or file. Starting in Panther 5.40, you can also create XML reports. To use these features, you must:

This feature is available for the following widget types:

This section describes the property specifications for widgets. For information on XML screen properties, refer to "Defining XML Tags for Screens." For details on using the interface, refer to Chapter 22, "Using XML Data," in the Application Development Guide.

How to Set XML Properties for Widgets

  1. Select the widget.
  2. Under XML, enter a value in the XML Tag property.
  3. (Optional) If you entered an XML tag for the widget, you can enter additional attributes in the XML Attributes property. This information will appear in the XML opening tag.
  4. (Optional) Enter values in the XML Prefix and XML Postfix properties.

Generating the XML for Widgets

When the XML is generated for the screen, container widgets are handled differently than data entry and selection widgets.

For container widgets (boxes, tab decks, tab cards and grids), Panther generates the following:

A container is included in the generated XML if any of its widgets have XML property values.

For data entry and selection widgets (dynamic labels, single line text widgets, multiline text widgets, option menus, combo boxes and listboxes), Panther generates the following:

For a sample file, refer to "Sample XML File" in Application Development Guide.

Processing XML for Multiple Occurrences

When a grid is converted to XML, the maximum number of occurrences of each grid member having an XML Tag property determines the number of occurrences to output. All offscreen data will be written to the XML.

Importing XML to Screens

Panther screens can import XML files. For this feature to work, the tags in the XML file must match the tags specified for the screen and the widgets.