Date:  12-01-2008

Subject: PATCH RELEASE 9.3 Runtime Files

    These release notes pertain to the following programs or files:

        EMBEDINI        9.3   01 Dec 2008       9,3,0,500
        MAKECLI         9.3   01 Dec 2008       9,3,0,500
        MAKECON         9.3   01 Dec 2008       9,3,0,500
        MAKEDEF         9.3   01 Dec 2008       9,3,0,500
        MAKEMFD         9.3   01 Dec 2008       9,3,0,500
        PLBCLI          9.3   01 Dec 2008       9,3,0,600
        PLBCLICON       9.3   01 Dec 2008       9,3,0,500
        PLBCLIENT       9.3   01 Dec 2008       9,3,0,500
        PLBCLINET       9.3   01 Dec 2008       9,3,0,500
        PLBCON          9.3   01 Dec 2008       9,3,0,500
        PLBDSIGN        9.3   01 Dec 2008       9,3,0,500
        PLBNET          9.3   01 Dec 2008       9,3,0,500
        PLBRUN          9.3   01 Dec 2008       9,3,0,600
        PLBSERVE        9.3   01 Dec 2008       9,3,0,500
        PLBSERVET       9.3   01 Dec 2008       9,3,0,500  (Threaded Server)
        PLBWIN          9.3   01 Dec 2008       9,3,0,500

        SUNAAMDX        9.3   01 Dec 2008       9,3,0,500
        SETGUID         9.3   01 Dec 2008       9,3,0,500
        SUNINDEX        9.3   01 Dec 2008       9,3,0,500
        SUNLS           9.3   01 Dec 2008       9,3,0,500  (New)
        SUNMOD          9.3   01 Dec 2008       9,3,0,500
        SUNSORT         9.3   01 Dec 2008       9,3,0,500

        ODSBAC32.DLL    9.3   01 Dec 2008
        PLBWSEC.DLL     9.3   01 Dec 2008       9,3,0,500
        SA_DLL32.DLL    9.3   01 Dec 2008       9,3,0,500
        SUNWADO.DLL     9.3   01 Dec 2008       9,3,0,500
        SUNWODBC.DLL    9.3   01 Dec 2008       9,3,0,500
        SUNWMSQL.DLL    9.3   01 Dec 2008       9,3,0,500
        SUNWSRV.DLL     9.3   01 Dec 2008       9,3,0,500

        PLBCMP          9.3   01 Dec 2008
        PLBDBUG         9.3   01 Dec 2008

        PLBEQU.INC      9.3   01 Dec 2008
        ADMEQU.INC      9.3   01 Dec 2008
        PLBMETH.INC     9.3   01 Dec 2008

        DBGIFACE.PLC    9.3   01 Dec 2008
        DESIGNER.PLC    9.3   01 Dec 2008
        SUNIDE.PLC      9.3   01 Dec 2008
        SUNLIST.PLC     9.3   01 Dec 2008
        WATCH.PLC       9.3   01 Dec 2008

        SUNCSENC.OCX    9.3   01 Dec 2008

*==============================================================================
Notes for some NEW Items:

  - Sunbelt License Server.

*==============================================================================
Notes for DOCUMENTATION:

  - Add the following note (11.) to the GETPROP instruction:

      11. When any property has a destination variable that is a GUI object,
          then the destination GUI object must not be created. Otherwise, the
          destination GUI object is NOT replaced and it remains unchanged. This
          is the GETPROP instruction behavior since the original
          implementation."

  - Add the following note (9.) to the IMAGELIST ADDBMP method:

       9. A {bmp} resource number value of zero causes the imagelist picture to
          be loaded from the clipboard."

  - Add the following note (7.) to the IMAGELIST LoadStdToolBitmap method:

       7. The execution of the LoadStdToolBitmap method causes the currently
          created IMAGELIST to be destroyed and replaced with the default
          images and specialized images from the runtime resources. After the
          LoadStdToolBitmap method has successfully executed, the newly
          created IMAGELIST object has the properties implicitly set by the
          method as follows:

            MASKCOLOR=0xC0C0C0
            USECOLORMASK=1
            USEMASK=1
            IMAGEHEIGHT=16
            IMAGEWIDTH=16"

  - Change the USEMASK property for the IMAGELIST object to read as follows:

      The USEMASK property determines whether an IMAGELIST object is to be
      created to support an image masking or not. When the USEMASK property is
      set ON, then it is possible to apply an image mask using the COLORMASK
      COLORMASK and USECOLORMASK properties to create transparent areas when an
      image is added to the IMAGELIST object. When an IMAGELIST is created with
      the USEMASK set to OFF, then the IMAGELIST object can not support image
      masking and using the COLORMASK and USECOLORMASK properties to apply a
      color mask causes the images to have black areas. The property uses the
      following format:"

  - Modify the note (2.) for the USECOLORMASK property as follows:

        2. When a masked image is drawn, the mask color specified by the
           COLORMASK property is combined with the image when the USECOLORMASK
           property is set to ON. This operation can only create transparent
           areas for an image if the USEMASK property was set ON when an
           IMAGELIST object is created. Otherwise, applying an image mask can
           cause black areas to appear in an image."

  - Modify the AUTOSCALE property for the PICT object to remove the $NONE value
    and identify the $SCALEBEST as the default value.

      Value  Keyword    Picture scaling is ...
        1   $SCALEBEST  best fit. (default)
        2   $SCALEHORZ  horizontal.
        3   $SCALENONE  disabled. (same as RESIZE=$OFF)
        4   $SCALEVERT  vertical.

  - Modify the TYPE instruction to include the following object type values for
    a NETOBJECT and NETCONTROL.

      Data       Type   Sunbelt  SWDBC
      NETOBJECT  14128  (0x3730)  16
      NETCONTROL 14384  (0x3830)  16

*==============================================================================
The following files have been changed as outlined below:

-------------------------------------------------------------------------------
PLBSERVE

  - Modified the Application Server to allow the DISPLAY/KEYIN *DSPMODE and
    *KEYMODE controls to take affect at the client. The *DSPMODE/*KEYMODE mode
    values of 0 and 1 are supported. A mode value of 1 causes the client
    (Plbclient, Plbclicon, or Plbclinet) to use stdin and/or stdout for
    DISPLAY/KEYIN IO.

    The changes as described can allow the plb clients to be used for a web
    server cgi interface.

  - Modified to support the License Server. See the SUNLS section for details.

  - Corrected a problem where the PAUSE instruction was not being ignored when
    an event was pending using PLBSERVE.

  - Corrected a problem where the PAUSE instruction did not detect when the end
    user program clicks the main window close button.

  - Corrected a problem where the CHECKEVENT instruction was not update the
    ARG1 to ARG10 parameters when an event was dispatched.

-------------------------------------------------------------------------------
PLBSERVE(WINDOWS)

  - Corrected a problem where the ADMGETINFO instruction was only returning
    zero for the $ADMITEMSRVVER server version. This problem started with
    release 9.2 of the Windows Application Server that is processed based.

  - Corrected a problem where PLBSERVE was not detecting a NT Service stop
    command when the PLBCS_HOSTNAME ip address was '0.0.0.0'.

-------------------------------------------------------------------------------
PLBCLICON

  - Modified the console client to allow the stdin/stdout to be redirected for
    DISPLAY/KEYIN IO with or without the use of the DISPLAY/KEYIN '*DSPMODE=1'
    and '*KEYMODE=1' controls. Prior to this change the redirected IO did not
    work for the PLBCLICON client.

-------------------------------------------------------------------------------
PLBCLIENT, PLBCLICON, PLBCLINET

  - Modified the clients to allow the DISPLAY/KEYIN '*DSPMODE=1' and
    '*KEYMODE=1' controls to take affect and be used by the client to redirect
    DISPLAY/KEYIN IO to stdin/stdout. This ability to redirect stdin/stdout at
    the client requires that both the Plbserve and client must be a 9.3 version
    or later.

    These changes allow a client to be used by a Web Server using the CGI
    interface.

  - Added a new command line option named '-quiet' for the clients. This
    command line option prevents all client administrative data displays at the
    client workstation. In this case, a quiet error log file named
    'plbclient_quiet.log', 'plbclicon_quiet.log', or 'plbclinet_quiet.log' is
    created in the same directory where the executable is located. Any error
    messages generated by the client is stored into the quiet error log file.
    The '-quiet' command line option is required to eliminate any unwanted
    display data when using a Web Server CGI interface.

  - Modified to remove trailing blanks from the data for embedded keywords.

-------------------------------------------------------------------------------
PLBCLIENT, PLBCLINET

  - NT Service support has been added for the client modules. The client
    module's command line options have been change to include the following:

      Command Line Option:

       -delete          - Remove NT Service.
       -idefault        - Install NT Service using default OS settings.
       -ilocal          - Install NT Service using
                          'NT AUTHORITY\\LocalService'.
       -inetwork        - Install NT Service using
                          'NT AUTHORITY\\NetworkService'.
       -iuser=name;pass - Install NT Service using specified username/password.

  - New keywords have been added for the client modules to support NT Service
    recovery configuration settings:

      PLBCS_SERVICE_FAIL1={0, 1, or 2}  - First failure action.

        0 - Take no action (default)
        1 - Restart the service
        2 - Reboot the computer

      PLBCS_SERVICE_FAIL2={0, 1, or 2}  - Second failure action.

        0 - Take no action (default)
        1 - Restart the service
        2 - Reboot the computer

      PLBCS_SERVICE_FAIL3={0, 1, or 2}  - Subsequent failures action.

        0 - Take no action (default)
        1 - Restart the service
        2 - Reboot the computer

      Note for PLBCS_SERVICE_FAILx:

        If the service controller handles the SC_ACTION_REBOOT action, the
        caller must have the SE_SHUTDOWN_NAME privilege. For more information,
        see Running with Special Privileges in the Microsoft documentation.

      PLBCS_SERVICE_DELAY1 = 0 <= {min} <= 60 - Time to wait before taking
                                                action for first failure.
      PLBCS_SERVICE_DELAY2 = 0 <= {min} <= 60 - Time to wait before taking
                                                action for Second failure.
      PLBCS_SERVICE_DELAY3 = 0 <= {min} <= 60 - Time to wait before taking
                                                action for subsequent
                                                failures.

      PLBCS_SERVICE_DESC = {desc}      - Description for NT Service.

      PLBCS_SERVICE_RESTART = {ON|OFF} - When this keyword is set to 'ON', the
                                         NT Service will restart the client
                                         module if the NT Service is
                                         configured to 'Restart Service' on
                                         failures and the PLBCLIENT is
                                         terminated.

-------------------------------------------------------------------------------
PLBSERVE, PLBCLIENT, PLBCLICON, PLBCLINET

  - Corrected a problem where the APPEARANCE property was not defaulting to the
    parent Window setting when the APPEARANCE was not specified in a CREATE
    instruction. This changes corrects a problem where a CREATE of a LISTVIEW
    object on the MAINWINDOW did not have a border using PLBWIN and the same
    program had a border using PLBCLIENT/PLBSERVE.

-------------------------------------------------------------------------------
PLB(UNIX), PLBSERVE(UNIX)

  - Corrected a SEGV error that could occur when opening a XFILE with a user
    '.xml' file specified that contained complex XML data elements. This SEGV
    error was caused by a memory buffer conflict using realloc.

-------------------------------------------------------------------------------
PLBWIN, PLBNET

  - NT Service support has been added for the runtimes. The runtime command
    line options have been change to include the following:

      Command Line Option:

       -delete          - Remove NT Service.
       -idefault        - Install NT Service using default OS settings.
       -ilocal          - Install NT Service using
                          'NT AUTHORITY\\LocalService'.
       -inetwork        - Install NT Service using
                          'NT AUTHORITY\\NetworkService'.
       -iuser=name;pass - Install NT Service using specified username/password.

  - New keywords have been added for the runtimes to support NT Service
    recovery configuration settings:

      PLB_SERVICE_FAIL1={0, 1, or 2}    - First failure action.

        0 - Take no action (default)
        1 - Restart the service
        2 - Reboot the computer

      PLB_SERVICE_FAIL2={0, 1, or 2}    - Second failure action.

        0 - Take no action (default)
        1 - Restart the service
        2 - Reboot the computer

      PLB_SERVICE_FAIL3={0, 1, or 2}    - Subsequent failures action.

        0 - Take no action (default)
        1 - Restart the service
        2 - Reboot the computer

      Note for PLB_SERVICE_FAILx:

        If the service controller handles the SC_ACTION_REBOOT action, the
        caller must have the SE_SHUTDOWN_NAME privilege. For more information,
        see Running with Special Privileges in the Microsoft documentation.

      PLB_SERVICE_DELAY1 = 0 <= {min} <= 60 - Time to wait before taking action
                                              for First failure.
      PLB_SERVICE_DELAY2 = 0 <= {min} <= 60 - Time to wait before taking action
                                              for Second failure.
      PLB_SERVICE_DELAY3 = 0 <= {min} <= 60 - Time to wait before taking action
                                              for subsequent failures.

      PLB_SERVICE_DESC={desc}       - Description for NT Service.

      PLB_SERVICE_RESTART={ON|OFF}  - When this keyword is set to 'ON', the NT
                                      Service will restart the runtime if the
                                      the NT Service is configured to 'Restart
                                      Service' on failures and the PLB program
                                      is terminated.

      PLB_SERVICE_CMDLINE={cmdline} - The {cmdline} is specified as a PLB
                                      runtime command line without the runtime
                                      runtime module name.

      Examples:

        PLB_SERVICE_CMDLINE=ProgName
        PLB_SERVICE_CMDLINE=-i c:\app\my.ini ProgName

      Notes:

        1. If there is a need to install more than one NT Service for a PLB
           runtime, the user can copy the PLBNET or PLBWIN runtime executable
           to an EXE with a different name and it a runtime with a different
           name.

        2. All of the defined NT Server keywords are optional.

-------------------------------------------------------------------------------
PLBWIN, PLBNET, PLBSERVE, PLB(UNIX)

  - Increased the maximum pending connects from 1 to 10 for a COMFILE that is
    opened for a socket to listen for multiple connections.

  - Optimized the XFILE operations when writing at the EOF record position.
    Depending on the speed of the CPU being used, this change can improve the
    performance of writing 200000 records by a factor of 400 or more.

  - Added a new keyword named 'SCHEMATYPE={svar}' for a GETFILE XFILE
    instruction. The GETFILE SCHEMATYPE keyword returns a delimited string that
    includes the schema data label references with a XML data node type and its
    schema type.

    The format for SCHEMATYPE data with semi-colon ';' character delimiters is:

      '{data};{data1};...'

      Where:

        {data} = '<name>,<type},{schematype}'

        Where:

          {name}       - Name of xml element or attribute
          {type}       - A=attribute or E=element
          {schematype} - S=xsd:string, N=xsd:decimal, or B=xsd:boolean

    Notes:

      1. When a XFILE is created and written in a PLB program, the default
         {schematype} for all xml data references are defined to be
         'xsd:string'.

      2. The SETFILE SCHMATYPE is used to change the current schema types.

  - Added a new keyword named 'SCHEMATYPE=svarslit' for a SETFILE XFILE
    instruction. The SETFILE SCHEMATYPE keyword is used to change the
    schema type for a schema data label reference. The SETFILE SCHEMATYPE data
    string is a delimited string that is defined the same as described for the
    GETFILE SCHEMATYPE keyword.

    Note:

      1. The SETFILE SCHEMATYPE data should only include the schema data label
         references that are to be changed.

  - Corrected a problem where the trace log for the MAILSEND instruction was
    reporting the wrong month value.

  - Corrected problems for the AAMDEX instruction when double quotes were used
    around command line arguments with embedded blank characters.

  - Corrected problems for the INDEX/SORT instruction when double quotes were
    used around command line arguments with embedded blank characters.

  - Corrected a S13 syntax error with a subcode 109 when there were blanks
    after a comma and before the Lnn parameter using the INDEX instruction.

  - Corrected a problem where an IFILE Write operation could process the ISI
    deleted record map twice. This would waste time unnecessarily when a
    deleted record was re-written. This problem only caused a performance
    problem when there was a large number of deleted records in an ISI file and
    weof was not being used.

  - Corrected a problem where setting the XFILE_OPENREADONLY bit in the XFILE
    OPEN mode parameter cleared the XFILE_ALLCHARS bit.

  - Corrected a problem where CDATA xml data was being passed to the PLB
    program variables with UTF8 data sequences for READ XFILE operations.

  - Corrected a problem where an ADMLOGON without a Public key would cause an
    unexpected O155 error when it was executed after a previous ADMLOGON was
    executed with a Public key being used.

  - Corrected a problem where the CLOCK ERROR instruction could report the
    wrong file name after an untrapped error causes a chain to a master
    program.

-------------------------------------------------------------------------------
PLBWIN, PLBNET, PLBSERVE, ALL GUI CLIENTS

  - Modified the SETMODE instruction to support a new keyword named
    '*PLBANSIOEM={nvar|ivar|dnum}'. A PLB program can use the *PLBANSIOEM
    keyword to control the runtime/client ANSI/OEM translations as described
    for the runtime 'PLB_ANSI_OEM' keyword.

      *PLBANSIOEM Value   PLB_ANSI_OEM keyword action
      -----------------   ---------------------------
            0           - PLB_ANSI_OEM=OFF
            1           - PLB_ANSI_OEM=ON
            2           - PLB_ANSI_OEM=INPUT
            3           - PLB_ANSI_OEM=OUTPUT
            4           - PLB_ANSI_OEM=CONSOLE

      Notes:

        1. The SETMODE *PLBANSIOEM ONLY controls the processing for the runtime
           keyword named 'PLB_ANSI_OEM'.

        2. If an *PLBANSIOEM value other than ( 0 <= value <= 4 ) is specified,
           there is no change to the current ANSI/OEM translation mode.

  - Modified the GETMODE instruction to support a new keyword named
    '*PLBANSIOEM={nvar|ivar}'. A PLB program can use the *PLBANSIOEM keyword to
    get a numeric value that specifies the current runtime ANSI/OEM translation
    mode for either the 'PLB_ANSI_OEM' or the 'PLB_OEM' runtime keywords. The
    following table gives the expected returned values for the ANSI/OEM
    translations that are in use:

      *PLBANSIOEM Value   PLB_ANSI_OEM or PLB_OEM keyword used
      -----------------   ------------------------------------
            0           - PLB_ANSI_OEM=OFF
            1           - PLB_ANSI_OEM=ON
            2           - PLB_ANSI_OEM=INPUT
            3           - PLB_ANSI_OEM=OUTPUT
            4           - PLB_ANSI_OEM=CONSOLE

           10           - ANSI/OEM translation not used

           11           - PLB_OEM=ON        ;obsolete keyword
           12           - PLB_OEM=INPUT     ;obsolete keyword
           13           - PLB_OEM=OUTPUT    ;obsolete keyword
           14           - PLB_OEM=CONSOLE   ;obsolete keyword

      Note:

        1. The PLB_ANSI_OEM replaces the obsolete PLB_OEM keyword.

  - Added a new property for a RADIO button named 'GROUPVALUE={nvar}'. The
    GROUPVALUE property is available for the GETPROP and SETPROP instructions.
    The SETPROP GROUPVALUE instruction executes like the SETITEM instruction
    for a RADIO object using a numeric value.  The GETPROP GROUPVALUE
    instruction executes like the GETITEM instruction for a RADIO object.

  - Modified the GETMODE and SETMODE instructions to support a new keyword
    named '*FORMLOADMASK={nvar|ivar}'.  A PLB program can use the *FORMLOADMASK
    keyword to change the behavior of the FORMLOAD instruction. The numeric
    value for the *FORMLOADMASK keyword is a bit mask value with the following
    definitions:

      Bit Mask Value   Behavior Action

        0x00000001   - When this bit is set in the *FORMLOADMASK value, the
                       FORMLOAD instruction sets the parent WINDOW to the form
                       size of an Object-Only PLF before creating the PLF
                       objects. After all of the Object-Only PLF objects are
                       created, the parent WINDOW is resize to its original
                       height and width before the FORMLOAD was executed.

  - Corrected a problem where an ALT-key sequence did not work when a MDI child
    window was maximized within the frame of its parent window and MENU objects
    were being used.

-------------------------------------------------------------------------------
PLBWIN, PLBNET, ALL GUI CLIENTS

  - Modified SETPROP for an EDITTEXT object to correct a problem where changing
    the STATIC property for an EDITTEXT object was causing the TOOLTIP property
    to become non-functional until the object was subsequently activated again.

  - Modified the LISTVIEW CHECKBOX and IMAGELISTST properties eliminate
    inconsistent operations caused by clearing and setting the CHECKBOX
    property.

    With the corrective actions the following checkbox behavior is expected:

      1. If the IMAGELISTST property is NOT SET to a user IMAGELIST, then the
         CHECKBOX uses a default Windows OS checkbox imagelist when the
         CHECKBOX property is enabled.

      2. If the IMAGELISTST property is SET to a user imagelist, then the
         CHECKBOX property uses the user imagelist when the CHECKBOX property
         is enabled.

    Example of Problem that was corrected:

      The following example code should be showing the user imagelist images.

        SETPROP   LISTVIEW1,IMAGELISTST=IMAGELIST1
        SETPROP   LISTVIEW1,CHECKBOX=0
        SETPROP   LISTVIEW1,CHECKBOX=1

  - Modified the LISTVIEW object to support a new method named
    'GetColumnCount'. This method returns the number of columns that have been
    inserted into a LISTVIEW object.  The number of columns includes normal
    user data columns as well as the special columns for background color,
    foreground color, and attributes.

    *--------------------------------------------------------------------------
    . GetColumnCount Method for LISTVIEW
    .
    The GetColumnCount method returns the current column count that has been
    inserted into a LISTVIEW object.

    The method uses the following format:

      [label] {object}.GetColumnCount GIVING {return}

        Where:

          {label}   is an optional Program Execution Label.

          {object}  is a required LISTVIEW object to be accessed.

          {return } is an Numeric Variable that receives LISTVIEW column
                    count. A return value of zero indicates no columns. While
                    a non-zero value indicates the number of columns.

    Flags Affected: OVER, ZERO

    Notes:

      1. The ZERO flag is set to a TRUE state when the {return} value zero.
         Otherwise the ZERO flag is cleared.

      2. The OVER flag is set to a TRUE state if the value returned is too big
         to be stored into the {return} variable.

  - Added a new method for a LISTVIEW object named 'GetAttributeColumn'. This
    method returns the column number for the special column that was inserted
    for the Attribute column.

    *--------------------------------------------------------------------------
    . GetAttributeColumn Method for LISTVIEW
    .
    The GetAttributeColumn method returns the current column number
    used for the Attribute column.

    The method uses the following format:

      [label] {object}.GetAttributeColumn GIVING {return}

        Where:

          {label}   is an optional Program Execution Label.

          {object}  is a required LISTVIEW object to be accessed.

          {return } is a Numeric Variable that receives LISTVIEW
                    attribute column number.

    Flags Affected: OVER, ZERO

    Notes:

      1. The ZERO flag is set to a TRUE state when the {return} value zero.
         Otherwise the ZERO flag is cleared.

      2. The OVER flag is set to a TRUE state if the value returned is too big
         to be stored into the {return} variable.

  - Added a new method for a LISTVIEW object named 'GetBGColorColumn'. This
    method returns the column number for the special column that was inserted
    for the background color column.

    *--------------------------------------------------------------------------
    . GetBgColorColumn Method for LISTVIEW
    .
    The GetBgColorColumn method returns the current column number used for the
    background color column.

    The method uses the following format:

      [label] {object}.GetBgColorColumn GIVING {return}

        Where:

          {label}    is an optional Program Execution Label.

          {object}   is a required LISTVIEW object to be accessed.

          {return }  is a Numeric Variable that receives LISTVIEW background
                     column number.

    Flags Affected: OVER, ZERO

    Notes:

      1. The ZERO flag is set to a TRUE state when the {return} value zero.
         Otherwise the ZERO flag is cleared.

      2. The OVER flag is set to a TRUE state if the value returned is too big
         to be stored into the {return} variable.

  - Added a new method for a LISTVIEW object named 'GetFGColorColumn'. This
    method returns the column number for the special column that was inserted
    for the foreground color column.

    *--------------------------------------------------------------------------
    . GetFgColorColumn Method for LISTVIEW
    .
    The GetFgColorColumn method returns the current column number used for the
    foreground color column.

    The method uses the following format:

      [label] {object}.GetFgColorColumn GIVING {return}

        Where:

          {label}    is an optional Program Execution Label.

          {object}   is a required LISTVIEW object to be accessed.

          {return }  is a Numeric Variable that receives LISTVIEW foreground
                     column number.

    Flags Affected: OVER, ZERO

    Notes:

      1. The ZERO flag is set to a TRUE state when the {return} value zero.
         Otherwise the ZERO flag is cleared.

      2. The OVER flag is set to a TRUE state if the value returned is too big
         to be stored into the {return} variable.

  - Modified Print Preview to support mouse controls over a print page window
    as follows:

        Operation              Function
      ---------------------- -------------------------------------------------
      Mouse Wheel            Mouse operation scrolls a print page up and down.
      Left Mouse Down        Position to the bottom of a print page.
      Right Mouse Down       Position to the top of a print page.
      Shift+Left Mouse Down  Position to the top of the next print page.
      Shift+Right Mouse Down Position to the top of the previous print page.

  - Added two new buttons to Print Preview as follows:

        Button       Function
      ---------- ---------------------------------
      First Page Position to the first print page.
      Last Page  Position to the last print page.

  - Modified the runtime keyword 'PLBWIN_PRTPREV' to support the new Print
    Preview buttons named 'First Page' and 'Last Page'.

    PLBWIN_PRTPREV={1};{2};{3};{4};...;{14};(15);(16)

    This keyword allows specification of the command button and status bar
    captions used by the Print Preview window.  Note that the command button
    captions may indicate the quick select character by preceding the character
    with an ampersand (&).  All sixteen items followed by semicolons are
    required.  The item values specified are as follows:

    Item   Use                Default Value
    ---- ------------------ --------------------
      1  Preview window     Print Preview
      2  Print button       &Print
      3  Next button        &Next Page
      4  Previous button    Pre&v Page
      5  Goto button        &Go To
      6  Zoom In button     Zoom &In
      7  Zoom Out button    Zoom &Out
      8  Close button       &Close
      9  Status bar "Page:" Page:
     10  Dialog Item        of
     11  Dialog Item        Go Page
     12  Dialog Item        Enter Page
     13  Dialog Item        &GoTo
     14  Dialog Item        &Cancel
     15  First button       &First Page     (NEW)
     16  Last button        &Last Page      (NEW)

    Example:

      PLBWIN_PRTPREV=MyReview;&Prt;&Next;&Previous;&GoToIt;Z&IN;Z&OUT;&Cls;Pg;
                     of;GoPage;EnterPage;&GoToX;&Cancel;&First;&Last

  - Corrected a problem where the MAIN window was being created with an
    invalid height and position when the Windows Taskbar was docked to either
    the left or right edge of the screen.

  - Corrected a problem where a DESTROY SUBMENU was causing an object conflict
    when a submenu was referenced by more than one program variable.

  - Corrected a problem where the DeleteColumn method was disabling the special
    columns for background color, foreground color, and attributes when the
    column number being deleted was larger than these special control columns.

  - Corrected a problem where a GETPROP for the MDILIST property was always
    causing an O105 error.

  - Corrected a problem where the WIDTH property for a SPLITTER object could be
    reported incorrectly before the object was activated.

  - Corrected a problem where the ReplaceIcon method was returning a value of
    zero when a zero index was used.

  - Corrected a problem where the input for the EDITTEXT was accepting
    character values larger than 127 when the EDITTYPE was set to decimal.

  - Corrected a problem where the input for the EDITNUMBER was accepting
    character values larger than 127.

  - Corrected a problem where the MDI dock full mode for a MDI Client window
    was being cleared by a SETPROP when the MDILEFT, MDITOP, MDIHEIGHT, and
    MDIWIDTH properties were all zero. With this change, the MDI dock full mode
    is turned on when all of these properties are set to a value of zero using
    SETPROP.

  - Modified the PICT object to cleanup freed buffer pointers in the runtime to
    eliminate a GPF error in the PLB Designer.

  - Modified focus processing for the MDI client and child Windows to properly
    identify the Window that has the focus. This corrects a problem where the
    tabbing did not work after the focus was changed from a MDI child Window to
    an object on the MDI client Window.

-------------------------------------------------------------------------------
PLBCON

  - Corrected a problem where the runtime would hang indefinitely when stdin
    was redirected and the '*KEYMODE=1' was NOT used. With this change the
    PLBCON runtime is used to redirect the stdin and/or the stdout with or
    without the *DSPMODE and *KEYMODE controls.

      Example:

        plbcon program < in.txt

-------------------------------------------------------------------------------
PLBNET, PLBCLINET

  - Modified the runtimes to allow a NETOBJECT that has not been created to be
    processed/used as null parameter for a property in a SETPROP.

  - Modified the NETCONTROL object to support the AcceptTab property. When this
    property is set for a NETCONTROL object, then the tab key is passed to the
    .NET NETCONTROL object and tabbing remains under control of the .NET
    NETCONTROL object until the focus is changed to a different GUI object on
    the form.

  - Modified the runtime to detect that a 'System.Windows.Forms.DataGridView'
    object has lost the focus and then it executes a method to commit the edit
    buffer data.

  - Modified the NETCONTROL object to support a new property named EnterTab.
    When the EnterTab property is set for a NETCONTROL, then the Enter key
    value ( VK_RETURN ) is changed to be a Tab key value (VK_TAB) when a
    NETCONTROL has the focus. The EnterTab property is used to change the cell
    transition behavior for a NETCONTROL that been created for a .NET
    DataGridView when the Enter key is keyed.

-------------------------------------------------------------------------------
PLBCMP

   - Added the *EOFON, *EOFOFF, *EOFFLAG DISPLAY/KEYIN controls to the
     compiler.  These controls were originally implemented for 8.7F. However,
     they were left out of the 9.0 release.

   - Modified the FILL instruction to allow the fill variable list to contain
     numeric variables in addition to dim variables.

   - Modified the compiler to support the *PLBANSIOEM keyword for the GETMODE
     and SETMODE instructions. See *PLBANSIOEM description above.

   - Modified the compiler to support the *FORMLOADMASK keyword for the GETMODE
     and SETMODE instructions. See *FORMLOADMASK description above.

   - Corrected a problem that corrupted the PLC that caused a U51 when the
     %STOREPLF directive was used in a program that does not have an PLFORM
     include.

   - Corrected a problem where RECORD LIKE was not retaining the pseudo type
     for the RECORD being duplicated.

   - Corrected a problem for the EVENTINFO instruction where the compiler did
     not check for proper instruction termination using a blank.

     Example:

       RESULT   FORM   5
       NVAR     FORM   5
         .
                EVENTINFO  RESULT=nvar    ;Compiler error is EXPECTED!

-------------------------------------------------------------------------------
PLBDBUG

  - Corrected GPF errors for the DA, DV, DL, MV, and TP commands when an
    un-initialized auto-DIM variable was being referenced. Now, the debugger
    gives an appropriate error message.

-------------------------------------------------------------------------------
SUNLS

  - The SUNLS server is a Sunbelt License Server that is implemented to allow a
    single Sunbelt product serial number and authorization number to be used
    for the Data Manager and Application Server located a multiple end-user
    sites. The License Server controls and distributes license user tokens to
    the Data Manager and Application Servers that log onto the License Server.

      Definitions:

        Corporate License
          Serial number to activate dynamic user licensing for a Data Manager
          or Application Server.

        License Requestor
          Data Manager or Application Server configured to retrieve user
          license tokens from a specified License Server.

        License Server
          Data Manager or Application Server configured to distribute user
          license tokens to one or more License Requestors.

        User Token
          A user token represents the authorization to allow a single user to
          logon and use the services of a Data Manager or Application Server
          serialized for a Corporate License.

    General Description:

      The implementation for the Corporate License allows a single License
      Server to distribute user tokens to multiple License Requestors.
      A License Requestor logs onto the License Server to receive an allotment
      of user tokens that allows end users to log onto the requestors to run
      the PLB applications. The License Server manages the total user token
      count that has been licensed for a user authorization number. When there
      are insufficient license user tokens to distribute, then the License
      Requestor token request is rejected.

    LICENSE SERVER (Configuration Keywords):

      The SUNLS configuration file is named 'sunls.cfg'. This configuration
      file has an 'environment' section that provides the keywords to control
      basic License Server operations. Additional sections that are named
      using a Sunbelt Serial Number are added to the 'sunls.cfg' file to
      provide the required authorization numbers for License Requestors that
      can log onto the License Server.

      The [environment] section keywords are described as follows:

        LS_HOSTNAME={hostip}       (Required)

          This keyword must be specified in the configuration file of the
          License Server. This keyword specifies the IP address or URL of the
          server executing the License Server task.  The IP address is
          provided as a 'nnn.nnn.nnn.nnn' identifier.

          Where:

            {hostip} - IP/URL address of the license server.

        LS_PORTNUM={port number}   (Required)

          This keyword specifies the IP port number assigned to the License
          Server.

        LS_{id}={data}  (Required for License Requestor)

          A 'LS_{id}' keyword MUST be specified in the [environment] section
          so a License Requestor can log onto the License Server. The parameter
          string specified by this keyword configures the user token
          distribution to be applied for the License Requestor identified by
          the {id} name.

          Where:

            {id}   - A unique name used to identify the token distribution
                     parameters.

            {data} - The configuration data string contains comma-delimited
                     fields that are used to control the user-token
                     processing for a License Requestor.

            Note:

              1. The {data} string format is specified as follows:

                 {data} = {minlic},{maxlic},{blocksize},{nextsize}

                 Where:

                   {minlic}    - Minimum user token count.

                   {maxlic}    - Maximum user token count.

                   {blocksize} - User token allocation block size.

                   {nextsize}  - Available token count at the License
                                 Requestor when another token allocation is
                                 requested.

                 Example:

                   LS_DMSMALL=10,40,5,2

                     In this case, the License Requestor is configured to have
                     a minimum license token count of 10 and a maximum license
                     token count of 40. When the License Requestor requests a
                     token allocation, then the License Server sends tokens in
                     allocations of 5 tokens. The value of 2 specifies that
                     the License Requestor requests another license allocation
                     when it has 2 remaining tokens out of its existing token
                     allocation.

        LS_LOCALIP={ip address | url}  (Optional)

          This optional keyword specifies the URL or the IP address of a local
          system network with which to bind before attempting a connection to
          the LS_HOSTNAME address.  This is provided for situations where a
          server may have multiple independent networks available.  If this
          keyword is not used, all local IP addresses are searched.

        LS_PUBLIC={securitykey} (Optional)

          SUNLS supports message encryption when communicating with server
          clients.

          If this keyword exists in the configuration file when the server is
          loaded, public security is applied to all clients.  Any client that
          attempts to log onto the server must be using the same public key.
          The public key encrypts all messages transmitted between a runtime
          client and the server.  The {securitykey} string must be composed of
          up to sixteen (16) hexadecimal digits.

          Note:

            1. If no encryption key is specified, a default key is used.  All
               transmissions between the client and server are secure.

          Example:

            LS_PUBLIC=AF91C602424E880E

        LS_TERMTIME={seconds}  (Optional)

          The LS_TERMTIME keyword controls the number of seconds that the
          License Server waits for client runtimes to end after a terminate
          command has been executed.  If the {seconds} time expires, the
          License Server terminates immediately. If this keyword is not used,
          the terminate command causes the License Server to wait for an
          infinite amount of time for the client runtimes to log off.

          Note that the LS_TERMTIME keyword has been implemented to take affect
          dynamically. This means that the value of the keyword can be changed
          in the configuration file at any time before or after the terminate
          command has been executed.

          Example:

            LS_TERMTIME=60

      ADMIN_xxxx keywords

        Admin services have been implemented for the License Server.
        The normal ADMIN_xxxx keywords as documented for other
        Sunbelt products are implemented for the License Server.

      [Axxxxxx] section keywords

        The [Axxxxxx] sections are required for each Corporate License that the
        License Server is to support. The Axxxxxx correspondes to the actual
        license number of the product being used.  Each entry in a [Axxxxxx]
        section provides the Sunbelt Authorization number that is validated and
        used when a License Requestor logs onto the License Server.

        The [Axxxxxx] keyword entries are specified as follows:

        DM_AUTH={authno}

          Authorization number used for a Data Manager.

        DM_LOWSTART={value}      (Optional)

          This keyword is specified to set the low token value that causes the
          License Server to re-claim all of the currently free tokens from all
          of the License Requestors. If this keyword is not defined, the
          default low-token start value is 10.  When the low-token mode is
          activated and all of the current tokens are re-claimed, the License
          Server allocates tokens one at a time.

        DM_LOWEND={value}        (Optional)

          This keyword is specified to set the value where the License Server
          stops executing in a low-token mode. When the low-token mode is
          stopped, the License Requestors can receive and maintain tokens based
          on the LS_{id} keyword settings. If this keyword is not defined, the
          default value is set to 20.

        PLBCS_AUTH={authno}

          Authorization number used for an Application Server.

        PLBCS_LOWSTART={value}   (Optional)

          This keyword is specified to set the low token value that causes the
          License Server to re-claim all of the currently free tokens from all
          of the License Requestors. If this keyword is not defined, the
          default low-token start value is 10.  When the low-token mode is
          activated and all of the current tokens are re-claimed, the License
          Server allocates tokens one at a time.

        PLBCS_LOWEND={value}     (Optional)

          This keyword is specified to set the value where the License Server
          stops executing is a low-token mode. When the low-token mode is
          stopped, the License Requestors can receive and maintain tokens based
          on the LS_{id} keyword settings. If this keyword is not defined, the
          default value is set to 20.

        Example of a [A999999] and [A123456] section:

          [A054321]
          DM_AUTH=1234-5678-9012-3456-7890-1234
          DM_LOWSTART=20
          DM_LOWEND=30

          [A123456]
          PLBCS_AUTH=ABCD-9876-5432-1098-6543-JLMN
          PLBCS_LOWSTART=20
          PLBCS_LOWEND=30

      LICENSE REQUESTOR (Configuration Keywords):

        There are two keywords that MUST be placed into the configuration
        file for a Data Manager and/or Application Server that is
        used as a License Requestor.  The keywords named 'LS_ADDR' and
        'LS_ID' must be placed in the [environment] section for
        the License Requestor. Another optional keyword named 'LS_PUBLIC'
        is given to specify an encryption key required to access
        the License Server.

        The [environment] section keywords for a License Requestor are
        described as follows:

        LS_ADDR={ {hostip}[ ;{hostalt} ]  (Required)

          This keyword must be specified in the configuration
          file of a Data Manager or Application Server. The License
          Requestor logs onto a License Server to receive user tokens
          that allows end user applications to logon and use the
          Requestor services.

          Where:

            {hostip}  - IP/URL address of the license server.

            {hostalt} - Optional IP/URL address of an alternate
                        license server.
          Note:

            1. First, the License Requestor attempts to log onto the
               {hostip} License Server. If the first logon fails,
               the License Requestor attempts to log onto the {hostalt}
               License Server.

        LS_ID={id}  (Required)

          This {id} data for this keyword is sent to the License Server to
          specify the token distribution parameters that are to be used for
          this License Requestor.

          Where:

            {id} - A identification string sent to the License Server and used
                   to determine the token distribution parameters that are to
                   be used for this License Requestor.
          Note:

            1. The {id} string value is used to match the name given by the
               'LS_{id}' keyword that is specified in the [environment] section
               of the License Server configuration file.

          Example:

            LS_ID=DMSMALL

              In this case, the License Requestor is to logon to the License
              Server using the 'DMSMALL' parameter identification that is
              defined in the License Server configuration file.

            LS_PUBLIC={securitykey}    (Optional)

              Defines an optional key used to encrypt messages to and from a
              License Server.

-------------------------------------------------------------------------------
PLBEQU.INC

  - Added XFILE mode values.

  - Modified the AUTOSCALE property for the PICT object to remove the $NONE
    value and identify the $SCALEBEST as the default value.

  - Added $T_NETOBJECT, $T_NETCONTROL, $BT_NETOBJECT, $BT_NETCONTROL,
    $ST_NETOBJECT, and $ST_NETCONTROL equated values.

  - Corrected a problem where the $T_RADIOGRP and $T_RADIO equated values were
    reversed. The corrected values should be as follows:

      $T_RADIOGRP EQU 0x0D30  ;True type for object
      $T_RADIO    EQU 0x0E30  ;True type for object

  - Added special ANSI graphic character values.

  - Added the GROUPVALUE property for a RADIO object.

  - Added NETCONTROL as a referenced object for ACCEPTTAB.

  - Added ENTERTAB property description.

  - Corrected problem where $IDIGNORE was misspelled.

-------------------------------------------------------------------------------
PLBMETH.INC

  - Updated the Listview and Treeview values.

-------------------------------------------------------------------------------
ADMIN

  - Modified the log file output to write up to 4 records/lines per message.

  - Modified the ADMIN services to support the License Server.

      The ADMIN services have been modified for the License Server to provide
      information specific to an Authorization License in use by a License
      Requestor that is logged onto the License Server. In addition, ADMIN
      information provides information that is related to the current
      parameters and user tokens for a License Requestor that is logged onto
      the License Server.

      Data items for the ADMGETINFO instruction have been added to provide
      License Server information as follows:

        Authorization License Information:

          $AdmItemSerialNumber ( Value == 1 )
            The $AdmItemSerialNumber gives the Sunbelt serial number assigned
            to the Authorization License.

          $AdmItemProductName ( Value == 2 )
            The $AdmItemProductName gives the Sunbelt product name assigned to
            the Authorization License.

          $AdmItemMaxLic ( Value == 13 )
            The $AdmItemMaxLic gives the maximum number of users allowed for
            the Authorization License.

          $AdmItemUsedLic ( Value == 15 )
            The $AdmItemUsedLic gives the current number of users that are
            using the Authorization License.

          $AdmItemCompanyName ( Value == 16 )
            The $AdmItemCompanyName gives the end-user Company Name that is
            assigned to the Authorization License.

          $AdmItemMisAddr ( Value == 24 )
            The $AdmItemMisAddr give a return value of zero or not zero that
            identifies whether a License Requestor LS_ADDR has an invalid order
            for the {hostip} and {hostalt} IP addresses.

          $AdmItemProductVer ( Value == 25 )
            The $AdmItemProductVer gives the Sunbelt version for the Sunbelt
            product that is assigned to the Authorization License.

        License Requestor Information:

          $AdmItemUserIp ( Value == 1 )

            The $AdmItemUserIp gives the IP address for the License Requestor.

          $AdmItemMinLic ( Value == 12 )

            The $AdmItemMinLic gives the minimum user count allowed as
            configured for the LS_ID being used by the License Requestor.

          $AdmItemMaxLic ( Value == 13 )

            The $AdmItemMaxLic give the maximum user count allowed as
            configured for the LS_ID being used by the License Requestor.

          $AdmItemUsedLic ( Value == 15 )

            The $AdmItemUsedLic gives the current number of users that are in
            use by the License Requestor.

          $AdmItemLicAdmId ( Value == 23 )

            The $AdmItemLicAdmId gives the administration id of the parent
            Authorization License information. This is used to match multiple
            License Requestors to the parent Authorization License.

          $AdmItemLicThresh ( Value == 24 )

            The $AdmItemLicThresh gives the current {nextsize} parameter from
            the 'LS_{id}' group identifier that is being used by the License
            Requestor. This value identifies the available token count at the
            License Requestor when another token allocation is to be requested.

          $AdmItemLicBlock ( Value == 25 )

            The $AdmItemLicBlock gives the current {blocksize} parameter from
            the 'LS_{id}' group identifier that is being used by the License
            Requestor. This value identifies the number of user tokens that are
            allocated to the License Requestor for a single allocation request.

  - Additional runtime types have been added for the AdmGetInfo instruction as
    follows:

      Value   Runtime Type
      ----- ----------------------------------------
       13   Authorization License for License Server
       14   License Requestor

-------------------------------------------------------------------------------
SUNAAMDX

  - Corrected problems when double quotes were used around command line
    arguments with embedded blank characters.

-------------------------------------------------------------------------------
SUNINDEX, SUNSORT

  - Corrected problems when double quotes were used in command line arguments
    with embedded blank characters required file name parsing.

-------------------------------------------------------------------------------
SUNLIST.PLC

  - Added 'T' option to follow the EOF of a text file being written to by
    another program.

-------------------------------------------------------------------------------
SUNIDE.PLC

  - Fixed a bug where cross reference list files more with than 1000 pages
    would be incorrectly identified as an error.

  - Modified post compile processing to locate the .lst file when using an
    alternate compiler configuration.

  - Fixed the open file dialog to open .PLF files with the designer.

  - Modified build logic to delete the .lst file before executing the compiler.
    This way the IDE can identify a failed compile when the compiler errors
    before creating any output files.  Example - I10 on .sdb file.

  - Corrected an F02 error that can occur on compile or close if editing a form
    with more than 10 files open in the IDE

  - Corrected a Browse Label bug where labels could have the wrong source file
    listed for its declaration when loading a cross reference LST file.

  - Corrected multiple GOTOLABEL problems where occasionally it would open the
    wrong source and give a goto line dialog prompt.

  - Corrected an open project problem that could hang the IDE.

  - Fixed up New Project logic where a path character may not get inserted
    between the path and filename in the project file name/location field in
    the dialog.

  - Corrected potential untrapped error that could occur when config files are
    not accessible.

  - Added project option to put the compiler output in the same folder as the
    main source to a program.

  - Corrected a bug in the build process where if a programs main source is in
    a sub-folder from the projects working folder, it would always compile.
    The correction now only compiles when any of the sources have changed.

  - Corrected a problem where the IDE could not identify a program's includes
    if the source had a CR end of record

-------------------------------------------------------------------------------
SUNCSENC.OCX

  - Fixed to show underscore character in comments

  - Fixed color highlighting problem when a forcing character was used with a
    trailing white space.

-------------------------------------------------------------------------------
DBGIFACE.PLC

  - Corrected a bug where a break point was not immediately displayed in the
    breakpoint dialog when added via the dialog.

  - Corrected a focus race condition that can occur when the break points
    window was activated during startup.

  - Added logic to try to prevent applying invalid settings

  - Corrected a problem where the breakpoints window was not refreshing when
    enabling/disabling or clearing a breakpoint.

  - Corrected a bug that could cause a GPF if you right clicked on a numeric
    constant.

  - Made changes to improve performance of transitioning to/from loadmods.

-------------------------------------------------------------------------------
WATCH.PLC

  - Modified client display to show CPU time as hundredths of a second.

  - Disabled display of CPU time on client display for Data Managers.

  - Added column sorting to Programs, Modules, Files, Isam, AAM, and spool tab
    listviews.

  - Added logic to perform a numeric column sort of listview data for columns
    that contain numeric values.

  - Modified to allow client child debugging (-d3).
        
  - Added support for the Sunbelt License Server.

-------------------------------------------------------------------------------
DESIGNER.PLC

  - Added support for .Net collections.

  - Added a .Net DataGridView column editor with extended column types based on
    the DateTimePicker, MaskedTextBox, and NumericUpDown controls.

  - Redesigned the TabID numbering logic to permit numbering of .Net objects
    within .Net containers.

  - Added a Behavior option to provide control of the designer generated
    tabcontrol change code. The user can disable this option and provide their
    own change event logic if desired.

  - Modified logic in the form open routine to increase performance.

  - Added a Hide All function for panels to the form shortcut menu.

  - Added a Force Primary Display behavior option to ensure designer windows
    are positioned within the monitor's viewing area.

  - Added a Behavior option to force the creation of .Net objects with the
    defined assembly path.

  - Modified the internal label logic to ensure that the thirty-one byte label
    length limit is honored by the designer.

  - Corrected the calculation of the code window starting line number when
    designer generated code exists.

  - Added support for NetObjects.

  - Added support for AcceptTab, EnterTab, and Index properties to NetControls.

  - Added logic to allow the designer to store the design time visible state of
    panels and tabpanels.

  - Modified logic to create temporary designer files in the Sunbelt Designer
    directory within the $APPDATA folder.  Housekeeping logic was also added.

  - Enhanced the designer's error reporting logic to provide additional program
    status information upon failure.

  - Added logic to log .Net object property changes to the designer's undo
    file.

  - Modified the designer's keyboard routines to allow sizing and moving of
    .Net controls and objects.

  - Modified the ListView object to show a single row of sample data during the
    form design process.

  - Added support for .Net TabPages within TabControls.

  - Added the ability to export resources within the Resource Editor.
-------------------------------------------------------------------------------