Date: 05-28-2010 Subject: PATCH RELEASE 9.4B Runtime Files These release notes pertain to the following programs or files: PLBCLI.EXE 9.4B 28 May 2010 9,4,2,600 PLBCLICON.EXE 9.4B 28 May 2010 9,4,2,500 PLBCLIENT.EXE 9.4B 28 May 2010 9,4,2,500 PLBCLINET.EXE 9.4B 28 May 2010 9,4,2,500 PLBCON.EXE 9.4B 28 May 2010 9,4,2,500 PLBCONET.EXE 9.4B 28 May 2010 9,4,2,500 PLBDSIGN.EXE 9.4B 28 May 2010 9,4,2,500 PLBNET.EXE 9.4B 28 May 2010 9,4,2,500 PLBRUN.EXE 9.4B 28 May 2010 9,4,2,600 PLBSERVE.EXE 9.4B 28 May 2010 9,4,2,500 PLBSERVET.EXE 9.4B 28 May 2010 9,4,2,500 (Threaded Server) PLBWIN.EXE 9.4B 28 May 2010 9,4,2,500 PLBNETSUP.DLL 9.4B 28 May 2010 9,4,2,500 Required for PLBNET PLBWSEC.DLL 9.4B 28 May 2010 9,4,2,500 Req'd PLBWIN/PLBNET SA_DLL32.DLL 9.4B 28 May 2010 9,4,2,500 SUNWADO.DLL 9.4B 28 May 2010 9,4,2,500 SUNWODBC.DLL 9.4B 28 May 2010 9,4,2,500 ODSBAC32.DLL 9.4B 28 May 2010 (32 Bit ODBC Driver) ODSBAC64.DLL 9.4B 28 May 2010 (64 Bit ODBC Driver) EMBEDINI.EXE 9.4B 28 May 2010 9,4,2,500 MAKECLI.EXE 9.4B 28 May 2010 9,4,2,500 MAKECON.EXE 9.4B 28 May 2010 9,4,2,500 MAKECONET.EXE 9.4B 28 May 2010 9,4,2,500 MAKEDEF.EXE 9.4B 28 May 2010 9,4,2,500 MAKEMFD.EXE 9.4B 28 May 2010 9,4,2,500 SETGUID.EXE 9.4B 28 May 2010 9,4,2,500 SUNAAMDX.EXE 9.4B 28 May 2010 9,4,2,500 SUNINDEX.EXE 9.4B 28 May 2010 9,4,2,500 SUNMOD.EXE 9.4B 28 May 2010 9,4,2,500 SUNSORT.EXE 9.4B 28 May 2010 9,4,2,500 SUNWMSQL.DLL 9.4B 28 May 2010 9,4,2,500 SUNWSRV.DLL 9.4B 28 May 2010 9,4,2,500 DBEXPLORER.PLC 9.4B 28 May 2010 DESIGNER.PLC 9.4B 28 May 2010 EDITOR.PLC 9.4B 28 May 2010 PLBCMP.PLC 9.4B 28 May 2010 PROFILER.PLC 9.4B 28 May 2010 SCHEMAEDITOR.PLC 9.4B 28 May 2010 SUNIDE.PLC 9.4B 28 May 2010 WATCH.PLC 9.4B 28 May 2010 PLBMETH.INC 9.4B 28 May 2010 SUNCS21.OCX 9.4B 28 May 2010 *============================================================================== Notes for DOCUMENTATION: - For the DBCONNECT instruction description, add this {host} parameter example to the Note (2.). "SQLiteHost INIT "SQLite;;c:\mypath\mydatabase.db" - For the DBCONNECT instruction description, add this paragraph at the end. Note the following for SQLite access: 1. If the database file name is specified in the {host} parameter, the database file is created if it does not exist. 2. If the database file name is not specified in the {host} parameter, the SQLite database engine creates a private database as a temporary on-disk file. This private database is automatically deleted as soon as the database connection is closed. 3. If the database file name ":memory:" is specified in the {host} parameter, the SQLite database engine creates a private database as a temporary in-memory database for the connection. This in-memory database vanishes when the database connection is closed. 4. The {user} and {pass} parameters for the DBCONNECT instruction are not used by the SQLite database engine. - Change the description for a D209 error to include a subcode value as as follows: Unable to convert item during DBFETCH. The subcode value is a variable count from 1 to N for the fetch variable that encountered the conversion problem. - The MDELM compiler directive format should be documented as follows: MDELM "{characters}" - Add the following note for the LISTVIEW InsertAttrColumn method. 11. The {index} value can not be zero. Otherwise, the {return} value is -1 to indicate a failure. The attribute column can not be inserted as column zero because this creates a conflict when reporting the existence of the column using the GetAttributeColumn method. - Add the following note for the LISTVIEW InsertColumnBgClr method. 9. The {index} value can not be zero. Otherwise, the {return} value is -1 to indicate a failure. The special column can not be inserted as column zero because this creates a conflict when reporting the existence of the column using the GetBgColorColumn method. - Add the following note for the LISTVIEW InsertColumnFgClr method. 9. The {index} value can not be zero. Otherwise, the {return} value is -1 to indicate a failure. The special column can not be inserted as column zero because this creates a conflict when reporting the existence of the column using the GetFgColorColumn method. - Add the following note for the UPDATE, UPDATAB (FILELIST) instruction. 6. When the FILELIST files have been opened for record locking and the SINGLE record locking mode is used, the UPDATE FILELIST instruction searches all of the files in the FILELIST to release the record lock from the file that performed the last READ operation. The record lock is only released for the record that was just updated. - Modify the O153 error subcode 104 description as follows: 104: Unable to create OLE control object because of invalid class or required interfaces are not available. The Windows Extended error code is provided when it is available to be reported. In this case, the WINERR value in an extended OLE error that can help to identify the cause of the error. - In the 'Application Server Reference Manual' (PLBCS) please replace and/or rework the following notes in the 'Introduction/Considerations' section: A. Replace the Note 1. as follows: The PLBSERVE/PLBCLIENT PL/B program execution is optimized to minimize the network message traffic when possible. As a program is executed, the PLBSERVE runtime detects what instructions can be buffered and what instructions require immediate action. Instructions maybe buffered until either the message buffer is overflowed or until a non-buffered instruction is encountered at which time a single message is sent to the PLBCLIENT task to be processed. This technique provides the best means of minimizing the number of messages sent between the server task and a client. Any statement that does not return a result or any error will be buffered. These include such statements as: DISPLAY, SETMODE, WINHIDE, WINSHOW, WINERASE, WINREFRESH, SETWTITLE, ACTIVATE, CHECKITEM, DEACTIVATE, DELETEITEM, DISABLEITEM, DRAGITEM, ENABLEITEM, DESTROY The following statements are always buffered for all GUI objects except for AUTOMATION, COLLECTION, CONTROL, NETOBJECT, or NETCONROL objects. Buffering is not applied when these statements are used for AUTOMATION, COLLECTION, CONTROL, NETOBJECT, or NETCONROL objects. EVENTREG, INSERTITEM, and SETITEM The following statements are always buffered for all GUI objects except for AUTOMATION, COLLECTION, CONTROL, NETOBJECT, or NETCONROL objects. Buffering is not applied when a COLLECTION object is used. However, buffering is used for AUTOMATION, CONTROL, NETOBJECT and NETCONTROL objects only when these statements are grouped together and in this case, these statements can be mixed. SETPROP, and OBJECT METHODS with no result returned B. Replace the Note 2. as follows: The GETITEM statement is optimized to allow buffering. When multiple GETITEM statements are grouped together, the multiple statements are buffered and sent as a single message. The return results are processed to minimize the number of messages sent between the server and client tasks. C. Replace the Note 4. as follows: The CREATE statement is optimized to allow buffering. When multiple CREATE statements are grouped together, the multiple statements are buffered and sent as a single message. The return results are processed to minimize the number of messages sent between the server and client tasks. This type of buffering does not occur on the creation for WINDOW, FONT, or COLOR objects. C. Add the Note 8. as follows: The GETPROP statement is only buffered when the SETMODE *SRVBUFMODE keyword is set to a level 2. This mode allows a group of GETPROP statements to be buffered and sent as a single message. The return results are processed to minimize the number of messages sent between the server and client tasks. The SETMODE *SRVBUFMODE=2 works in a one shot manner. Once a user has verified that a group of GETPROP instructions does not have any interactions that can cause unexpected results, then a SETMODE *SRVBUFMODE=2 statement can be executed immediately prior to the first GETPROP statement in a group. Once the group of GETPROP statements have been sent to the client, the SETMODE *SRVBUFMODE reverts back to a previous level when a PLB instruction other than a GETPROP is encountered. The user application must execute another SETMODE *SRVBUFMODE=2 when there is another group of GETPROP instructions to be sent as a group. - In the PLB Language Reference manual, make the following changes for the DIALOG object. Change the Note (1.) as follows: 1. DIALOGs are an obsolete object type and have been superseded by using the WINTYPE property set to $MODAL for a WINDOW object. Add the Note (12.) as follows: 12. The DIALOG object is not implemented for the Application Server because it is an obsolete object. - In the PLB Language Reference manual, change the Note (1.) for the INTEGRAL property as follows: 1. INTEGRAL may be used in CREATE or GETPROP statements of a DATALIST object. The INEGRAL style for the DATALIST can only be invoked when the DATALIST object is created." *============================================================================== The following files have been changed as noted: ------------------------------------------------------------------------------- PLBSERVE - Modified the PLBSERVE runtimes to retrieve the PLB_TERM keyword from the client INI/UET. In addition, the default TERM keyword can be retrieved from the client UET. This change resolves a problem where unique PLBCLIUNX terminal types could not be specified for each client that is logged on to the Application Server. With this change, the PLBCLIENT/PLBCLINET clients can also specify the PLB_TERM or TERM keywords in the client INI/UET as appropriate. - Modified to prevent buffering of the new Activate method for the FLOATMENU object. This change is needed to prevent unexpected event processing when this method is executed. - Modified to support a new runtime command line option named '-d7'. This option can be used to invoke the PLBSERVE profile data collection for a PLB program using an extended profiler data format. The extended profiler data format includes information for the number of sockets that have been sent to a client and information about the current data size that is buffered for instructions to be sent to a client. Since this option is being sent to PLBSERVE via a PLBCLIENT command line, there is no profiler startup message that is presented to the end-user. Note: 1. When using the Application Server runtime, the runtime options are specified on the client's command line. Example: PLBCLIENT -d7 progname ------------------------------------------------------------------------------- PLBSERVE(UNIX) - Modified the initialization for a UNIX PLBSERVE to set the default screen image foreground/background colors to be white on black when a PLBCLIUNX client is used. ------------------------------------------------------------------------------- PLBSERVE, PLBCLIENT, PLBCLICON, PLBCLINET - Modified to allow 5 client process instances to logon to the Application Server and only account for one licensed user count. - The general process that allows multiple PLB instructions to be buffered and sent to a client in single message has been re-evaluated/updated. Changes have been made to optimize the overall performance when a program has instructions that are grouped. Changes have been implemented as follows: 1. With changes implemented in release 9.4B, buffering for SETPROP instructions that are using AUTOMATION, CONTROL, NETOBJECT and NETCONTROL objects is performed when the SETPROP statements are grouped together. Likewise, buffering is now implemented for the methods that do not return a result for the AUTOMATION, CONTROL, NETOBJECT and NETCONTROL objects. Buffering for the methods of NETOBJECT or NETCONTROL is only performed when both the client and the server are version 9.4B or later. Note: A. The buffering support for SETPROP and/or methods in this case is supported by default. B. The SETPROP and methods that do not return a result can be mixed/interleaved when buffering for methods is allowed. 2. A new keyword named *SRVBUFMODE has been added for the SETMODE instruction that can change the behavior of instruction buffering for the SETPROP and methods that do not return values for a NETOBJECT and/or NETCONTROL. See the SETMODE description for the *SRVBUFMODE=1. Note: A. Any time that the SETMODE *SRVBUFMODE instruction is executed the current instruction buffer is automatically flushed and sent a client. 3. By default GETPROP instructions are not buffered. The reason for not buffering GETPROP instructions is that an expected return value for one GETPROP property can be used as the source object for a subsequent GETPROP instruction. This can cause unexplainable errors when multiple GETPROP instructions are grouped together. However, if an end-user has a group of GETPROP instructions that absolutely has no interactions as described, the SETMODE *SRVBUFMODE keyword can be executed with a level 2 value to force a group of GETPROP instructions to be sent to a client in a single message. Note: A. The SETMODE *SRVBUFMODE=2 is executed as a one shot algorithm only for a group of GETPROP instructions that do not have any interactions. When any instruction other than a GETPROP is buffered, the *SRVBUFMODE=2 mode is terminated. 4. New application server runtime counters have been implemented to gather information about the process of buffering instructions in a PLB program. The end-user application can use new GETMODE keywords to retrieve these new counters in the application server as a program is executing. By evaluating this new counter information, an end-user can determine whether the PLB program is executing in an optimal manner when instruction buffering is being used. See the GETMODE descriptions for the keywords named *SRVBUFMODE, *SRVBUFOVERFLOW, *SRVBUFMAXSIZE, *SRVBUFCURSIZE, *SRVBUFDATASIZE, *SRVSENDCOUNT, and *SRVMESSAGECOUNT. - A new keyword named '*SRVBUFMODE={dnumnvar}' has been added to a SETMODE instruction. This keyword causes the current buffered messages to be flushed and then it sets the buffering level to the new value. Valid values are: Level 0: This is the default level of buffering. Level 1: This level of buffering adds the feature of allowing non message PL/B statements to be executed between SETPROP instructions for a NETOBJECT or NETCONTROL and methods that do not return a result. In this case, a non message PL/B instruction is any instruction that does not send a message to the client workstation. If an error occurs at the client for any of the buffered instructions, the program instruction pointer is set back to the statement that causes the failure. However, any operations executed by non message PL/B statements are not reset/undone. As an example if the following code segment was executed and an error occurs on the first SETPROP instruction. SETPROP Ctl,*Bad=45 READ File,Seq;Data SETPROP Ctl,*Text=Data For this example, both of the SETPROP statements are buffered. When an error happens on the first statement, the program instruction pointer is set back to the first SETPROP statement. But the READ operation is not reset/undone and the next READ would obtain the next record. Level 2: Level 2 is a temporary level that allows GETPROP statements to be grouped and sent to a client as a buffered message. This level of buffering is terminated when an instruction other than a GETPROP sends a message to the client. Also, this level of buffering is terminated when a GETPROP is to retrieve a creation instance of an object variable. When this level is terminated, the previous level of buffering is then restored. When using this mode, the programmer must be careful to not use a value in a GETPROP statement that was obtained from a previous GETPROP statement that exists in the same group of GETPROP instructions. - New keywords have been added to the GETMODE instruction to retrieve specific application server counter values that relate to the instruction buffer capabilities. The new keywords are defined as follows: *SRVBUFMODE={nvar} This keyword returns the current buffering level. The expected values returned in this case are: 0 - Default buffering mode is used. 1 - Special buffering mode for NETOBJECT and NETCONTROL. 2 - Special buffering mode for GETPROP. *SRVBUFOVERFLOW={nvar} This keyword returns a count of the number of times a new message could not fit into the message buffer and caused the buffer to be flushed to the client. *SRVBUFMAXSIZE={nvar} This keyword returns a byte size needed for the message buffer to hold the maximum number of instructions that could be buffered in a single message. This maximum size takes into account all overflow actions and represents a high water value. *SRVBUFCURSIZE={nvar} This keyword returns the current allocated size for the message buffer. *SRVBUFDATASIZE={nvar} This keyword returns the current byte size of data existing in the message buffer. *SRVSENDCOUNT={nvar} This keyword returns the current count of tcp/ip messages that have been sent from the server to the client. *SRVMESSAGECOUNT={nvar} This keyword returns the current count of client/server protocol messages sent from the server to the client. - Corrected a problem where fast events did not work when a MODAL dialog was active. ------------------------------------------------------------------------------- PLBWIN, PLBNET - Corrected a problem where the APPEARANCE property for a BUTTON was not saved into a PLF using the PLB Designer. - Corrected a problem where the BORDER property for the CHECKBOX and RADIO objects was not saved into a PLF using the PLB Designer. ------------------------------------------------------------------------------- PLBWIN, PLBNET, PLBSERVE, PLB(UNIX) - Added support for the new PROFILER instruction. See the PLBCMP section for a description of this instruction. - Modified the DEBUG instruction to allow any individual debug statement to be enabled/disabled under program control. See the PLBCMP section for a description of the changes for this instruction. - Modified the runtimes to allow the SQLite database engine to be loaded and used as a driver using keywords from the runtime INI file. This change allows a PLB program to access the SQLite database engine by referencing user defined keywords in a runtime INI file. Example (1): PLBWIN INI keyword with database specified: SOMEKEY=SQLITE,c:\mypath\mydata.db PLB Program sample: MYDB DBFILE DBCONNECT MYDB, "SOMEKEY;;", "", "" Example (2): PLBWIN INI keyword without database specified: SOMEKEY=SQLITE PLB Program sample: MYDB DBFILE DBCONNECT MYDB, "SOMEKEY;;c:\mypath\mydata.db","","" Example (3): PLBWIN INI keyword to access SUNDM: SOMEKEYDM=FILEMAN,127.0.0.1 SUNDM CFG keyword to access SQLite database engine: SOMEKEYDM=SQLite PLB Program sample: MYDB DBFILE DBCONNECT MYDB, "SOMEKEYDM;;c:\mypath\mydata.db","","" Example (4): PLBWIN INI keyword to access SUNDM: SOMEKEYDM=FILEMAN,127.0.0.1 SUNDM CFG keyword to access SQLite database engine: SOMEKEYDM=SQLite,c:\sundmpath\mydm.db PLB Program sample: MYDB DBFILE DBCONNECT MYDB, "SOMEKEYDM;;","","" - Reworked the MAILSEND connection logic to properly open a connection to a mail server using SMTP if a connection using ESMTP fails to be opened. - Corrected GPF errors executing a MAILSEND instruction that would happened while opening a SSL connection. - Corrected a GPF error that would occur when the following filter expression was being evaluated in a PLB READ operation. "colname LIKE '% %'" - Corrected a GPF error that would occur if a non-existing viewname was specified for VIEW keyword on an OPEN or PREP. - Corrected a problem where a READ FILE for a field using the column name syntax format would blank fill a data variable unexpectedly if the record size was shorter than a full record and this READ followed a previous partial IO READ that was terminated with a semi-colon. - Modified the UPDATE FILELIST to release a record lock that has been locked using a Secondary file in a FILELIST when using the SINGLE record lock mode. This corrects a problem where an UPDATE FILELIST was not releasing a record lock for a record just updated. - Corrected a problem when using record locking where one PLB program has a record locked to perform an AAM/ISAM UPDATE or DELETE operation and a second PLB program is in an AAM or ISAM read instruction waiting to lock the same record. The problem in this case was that the second PLB program could get an unexpected IO error or possibly get unexpected record data. The changes for this potential problem were diagnosed while implementing the UPDATE FILELIST correction as described above. The instructions affected by these changes are the Isam READ, READKS, and READKP as well as the AAM READ, READKG, and READKGP. - Corrected a problem where an AAMDEX instruction using a '-I' or '-R' option was causing an unexpected S13 error with a subcode 139 that indicated a bad AAM file name. - Corrected a problem where a DMAKE with a zero size would not clear a DIM pointer. This could cause a GPF at some later time if the dynamic DIM was de-allocated and this same DIM pointer was subsequently used. - Corrected a problem with column IO where some column fields were not returning expected data when a file was opened with variable length records. ------------------------------------------------------------------------------- PLBWIN, PLBNET, ALL GUI CLIENTS - Modified the processing for the Sunbelt special menu items CUT, DELETE, PASTE, and UNDO so these items are disabled when an EDITTEXT, EDITNUMBER, or RICHEDITTEXT object has the READONLY property applied. - Modified the READONLY property for the EDITTEXT and EDITNUMBER objects to invoke the Windows OS readonly style. This change is done to allow the Windows OS to disable special menu items CUT, DELETE, and UNDO for the objects with the readonly style applied. This change applies to a popup menu that the Windows OS creates/presents when a right mouse click occurs with the focus on these objects. - Added a new keyword named 'DEFAULTSCHEMA={svar}' to the GETMODE instruction. This keyword returns the file name of the SQLite database that is currently being used as the default schema database for a runtime. - Added a new keyword named 'DEFAULTSCHEMA={svarlit}' to the SETMODE instruction. This keyword can be used to change the default schema database that is used by a runtime. - Added a new keyword named 'FILTER={svar}' to the GETFILE instruction. This keyword can be used to fetch a filter string for a specified FILE, AFILE, or IFILE. If a filter string does not exist, a NULL DIM variable is returned. The maximum size expected for a filter string is 4096 bytes. - The following Windows OS bit values can be used for the {format} value using the InsertColumn or SetColumnFormat methods of a LISTVIEW object. The behavior associated with these {format} values depends on the version of the Windows OS components that are being used. For additional information, see the Microsoft documentation for the Windows OS LVM_INSERTCOLUMN or LVM_SETCOLUMN messages of a LISTVIEW control. Value Constant Description LVCFMT_LEFT 0x00000000 Text is left-aligned. LVCFMT_RIGHT 0x00000001 Text is right-aligned. LVCFMT_CENTER 0x00000002 Text is centered. LVCFMT_FIXED_WIDTH 0x00000100 Version 6.00 and Windows Vista. Can't resize the column. LVCFMT_IMAGE 0x00000800 Version 4.70. The item displays an image from an image list. LVCFMT_BITMAP_ON_RIGHT 0x00001000 Version 4.70. The bitmap appears to the right of text. This does not affect an image from an image list assigned to the header item. LVCFMT_COL_HAS_IMAGES 0x00008000 Version 4.70. The header item contains an image in the image list. LVCFMT_NO_DPI_SCALE 0x00040000 Version 6.00 and Windows Vista. If not set, CCM_DPISCALE will govern scaling up fixed width. LVCFMT_FIXED_RATIO 0x00080000 Version 6.00 and Windows Vista. Width will augment with the row height. LVCFMT_SPLITBUTTON 0x01000000 Version 6.00 and Windows Vista. Column is a split button. The header of the column displays a split button. - Modified the column click event for a LISTVIEW to set the event modifier value when the {format} using the SetColumnFormat method has been set to the LVCFMT_SPLITBUTTON bit mask value and a Windows OS column drop down event occurs. The LVCFMT_SPLITBUTTON format is only available for a Windows VISTA version or later with a Windows OS ComCtl32 DLL version 6 or later. When the LISTVIEW column drop down event is dispatched, the event modifier integer value is set to have the 0x00000001 bit set. - Modified the SetItemText method to eliminate excessive updates that resulted in the LISTVIEW flashing when the color/attribute text was stored into a special color/attribute column. - Modified the runtimes/clients to minimize object flashing when the program window was resized. Note: 1. The changes made in this case are not associated with the Windows OS double-buffer extended style. - Modified the LISTVIEW, TOOLBAR, and TREEVIEW objects to apply the Windows OS double-buffer extended style. This double-buffer extended style can help to minimize flicking when resizing a program window if the Windows OS common controls version 6.00 is used. Note: 1. This is the Microsoft MSDN description for the double-buffer extended style. "Paints via double-buffering, which reduces flicker. This extended style also enables alpha-blended marquee selection on systems where it is supported." 2. Whether the double-buffer extended style takes affect or not depends on whether the Windows OS system supports it or not. If a system does not support the double-buffer extended style, there is no impact and the object flickering may continue to exist. 3. On a Windows VISTA system, a manifest must be embedded into the runtime execution module before the double-buffering can take affect. - Modified the LISTVIEW object to use a specialized background erasing algorithm when a program WINDOW is being resized. This change is being done to help minimize flickering when the program WINDOW is resized. - Modified the BUTTON ICON property to physically remove the icon from the BUTTON control when the ICON property is being turned off. This change is needed to cause the behavior to be the same whether a manifest is used or not. - Modified the BUTTON PICTURE property to physically remove the picture from the BUTTON control when the PICTURE property is being turned off. This change is needed to cause the behavior to be the same whether a manifest is used or not. - Modified to support the ToolTip property for the NETCONTROL object. This changes allows the Windows native tooltip implementation to be applied to a NETCONTROL object like other Sunbelt GUI objects. The ToolTip property can be used for the CREATE, GETPROP, and SETPROP instructions using a NETCONTROL. - Modified the NETCONTROL to support the ToolTipHwnd property using a GETPROP instruction. - Modified the GETPROP for the FONT Bold, Strike, Underline, and Static properties to return a value 1 when these properties are set to be TRUE. - The runtimes have been modified to allow an icon to be placed into the Windows OS icon tray. The following modifications have been made to allow this icon tray support. 1. Added a new method named 'NotifyIcon' for a WINDOW object. This method can be used to put an icon into the Windows OS icon tray. The specified icon is directly associated with the WINDOW object so that a new click event for the WINDOW object is generated to reflect the end-user clicking actions on the icon in the icon tray. ............................................................... . NotifyIcon Method (WINDOW Object) . The NotifyIcon method assigns an icon to the WINDOW object and puts the icon into the Windows OS icon tray. In addition, this methods allows tooltip text to be associated with the icon in the icon tray. The method uses the following format: [label] {object}.NotifyIcon [GIVING {return}]: USING [*Icon=]{icon}: [*Tooltip=]{tooltip} Where: {label} is an optional Program Execution Label. {object} is a required WINDOW object to be accessed. {return} is an optional Numeric Variable that receives the pass or fail result for the execution of the method. {icon} is a required Numeric Variable, decimal value, Character String Variable, or Character String literal that identifies the icon to be used in the Windows OS icon tray. {tooltip} is an optional Character String Variable or literal that specifies the tooltip text to be assigned to the icon that is placed in the Windows OS icon tray. Flags Affected: OVER, ZERO Note the following: 1. The ZERO flag is set when the {return} value is zero, otherwise it is cleared. The {return} value is non-zero when the method execution fails. The OVER flag is set if the {return} variable is too small to contain the value and it is truncated, otherwise it is cleared. 2. The following values can be returned in the {return} variable. 0 - The method was executed successfully. 1 - The method failed because the icon identified by the {icon} parameter could not be loaded. 2 - Error occurred executing Shell_NotifyIcon with the NIM_DELETE command. 3 - Error occurred executing Shell_NotifyIcon with the NIM_MODIFY command. 4 - Error occurred executing Shell_NotifyIcon with the NIM_ADD command. 99 - Error when this method is not supported. 3. The end-user application must execute an EVENTREGISTER for a CLICK event for the {object} WINDOW that is used to execute the NotifyIcon method. The CLICK event for the WINDOW object is generated when an end-user performs left or right mouse click actions on the {icon} that has been put in the Windows OS icon tray. The WINDOW click event result contains a value that gives the mouse cursor position where the mouse click action was performed. In this case, the result value contains the top left coordinates where the mouse click action occurred. The result value contains the top and left mouse position as follows: result = ( LeftPosition * 10000 ) + TopPosition Example: Result FORM 8 Left FORM 4 Top FORM 4 . UNPACK Result, Left, Top The WINDOW click event modifier contains a value that identifies the current mouse state bits as described in the documentation for the EVENTREGISTER instruction. The click event modifier can be a combination of the following bit values. 0 - No modifier provided 1 - Alt Key 2 - Ctl Key 4 - Shift Key 8 - Left mouse button down 16 - Right mouse button down 32 - Double click 4. An end-user application can remove an active NotifyIcon from the icon tray by executing the NotifyIcon method with the {icon} value set to a value of zero. 5. An end-user application can remove the ToolTip from an active NotifyIcon in the icon tray by executing the NotifyIcon method with a NULL string for the {tooltip} parameter. 6. If a WINDOW object has an active NotifyIcon in the icon tray when the WINDOW object is destroyed, the active NotifyIcon is automatically removed from the icon tray. However, if the MAINWINDOW has an active NotifyIcon in the icon tray, the active NotifyIcon remains active until the end-user application terminates the NotifyIcon or when the MAINWINDOW is destroyed as a program shutdowns. Note: A. The behavior to allow an active NotifyIcon to persist when it is attached to the MAINWINDOW is implemented to allow a program to CHAIN without automatically having the NotifyIcon removed from the icon tray. However, the end-user application must always reset the click event using the EVENTREGISTER instruction after a CHAIN operation has been executed. - A new method named 'Activate' has been added for the FLOATMENU object. This method was implemented to activate a FLOATMENU with absolute position specified for the left and top coordinates. This method has been implemented to help support an easy placement of a FLOATMENU when it is being used in conjunction with a NotifyIcon click event. ............................................................... . Activate Method (FLOATMENU Object) . The Activate method causes a FLOATMENU object to be activated at the coordinates specified by the *Left and *Top parameters. The method uses the following format: [label] {object}.Activate [GIVING {return}]: USING [*Left=]{left}: [*Top=]{top}[: [*Flags=]{flags}] Where: {label} is an optional Program Execution Label. {object} is a required FLOATMENU object to be accessed. {return} is an optional Numeric Variable that receives the pass or fail result for the execution of the method. {left} is a required Numeric Variable or decimal value that gives the left coordinate position for the {object} FLOATMENU. The value is a pixel value relative to the upper left corner of the screen. {top} is a required Numeric Variable or decimal value that gives the top coordinate position for the {object} FLOATMENU. The value is a pixel value relative to the upper left corner of the screen. {flags} is an optional Numeric Variable or decimal value that is a bit mask to control specific behavior for the placement of the FLOATMENU. There are not special behaviors implemented at this time. At this time, the {flags} value MUST be zero or not specified. Otherwise, an error occurs. Flags Affected: OVER, ZERO Note the following: 1. The ZERO flag is set when the {return} value is zero, otherwise it is cleared. The {return} value is non-zero when the method execution fails. The OVER flag is set if the {return} variable is too small to contain the value and it is truncated, otherwise it is cleared. 2. The following values can be returned in the {return} variable. 0 - The method was executed successfully. 1 - The method failed because the {object} data type is not a FLOATMENU. The {object} MUST be a FLOATMENU. 2 - The {flags} value is invalid. 3. The {left} and {top} coordinate values can be extracted and used directly from the click event result value that is given for a WINDOW object with a NotifyIcon. See the description for the NotifyIcon method for a WINDOW object. - Added a new property named 'HELPTOPIC={svarslit}' for all GUI objects that have the HELPID property. The HELPTOPIC property is implemented to allow a user to specify a help keyword string for a given GUI object such that a help topic window can be activated when a F1 key is entered with the Windows help enabled. Note: 1. If the HELPTOPIC property string is set to be NULL, the help topic is removed from a GUI object. 2. The HELPTOPIC property string is used to invoke a Windows help topic window from a '.chm' help file when a F1 key is pressed while the focus is on a given object and the Windows help is enabled for a PLB program. 3. The HELPID property value is used to invoke a Windows help windows when the HELPID value matches the help context value defined in a '.chm' or '.hlp' when a F1 key is pressed while the focus is on a given object and the Windows help is enabled for a PLB program. The '.hlp' help format is not supported for Windows OS versions VISTA and later. 4. If both the HELPTOPIC and HELPID properties have been set, the HELPTOPIC property takes precedence over the HELPID property. However, if the HELPTOPIC operation fails and the HELPID has been set, then the HELPID value is used in an attempt to invoke a help window using a help context value. In this case, a failure for a HELPTOPIC operation means that the Windows OS help API failed to execute. 5. If the HELPTOPIC keyword string is not found in a '.chm' help file, the Windows help is activated with an appropriate invalid page message. 6. The maximum length for a HELPTOPIC keyword string is 255 bytes. 7. The HELPTOPIC property can be used in the CREATE, GETPROP, and SETPROP instructions. - The HELPTOPIC and HELPID properties have been added for the NETCONTROL object. - A new property named 'USERDATA={svarslit}' has been added for all GUI objects. This property has been implemented to allow application data to be assigned with individual GUI objects. This gives a PLB user application a way to assign specialized data to a GUI object to be used as needed. Note: 1. The maximum length for a USERDATA string is 40960 bytes. 2. The USERDATA string is expected to have ASCII data with character values larger than 0x20. A binary value of zero is not prevented but can cause the userdata string to be truncated using a GETPROP. 3. The USERDATA property can be used in the CREATE, GETPROP, and SETPROP instructions. - Corrected a GPF error that could occur when a PANEL GetObjectAsPointer method was executed with a RUNNAME parameter specified. A GPF error would occur if an object without a RUNNAME property string existed on the PANEL object. This same problem existed for the GetObjectAsPointer method for a WINDOW object. - Corrected a problem where a dragging action for an object on a PANEL with the WINOFFSETH/WINOFFSETV properties having non-zero values would show a dragging box at an invalid position on the PANEL. - Modified to correct a problem where the WIDTH for an EDITNUMBER object was changing to an unexpected result when a FONT was changed and the Up-Down control was being used. The PLB WIDTH for an EDITNUMBER is intended to include the width of an Up-Down control and the EDITNUMBER control. ------------------------------------------------------------------------------- PLB(UNIX) - Corrected a problem where a file variable in a global FILELIST was being corrupted when the file variable was opened/prepared after a ROLLOUT instruction was executed. The corrupt file variable would cause indeterminate program execution that could cause a SEGV error to occur. ------------------------------------------------------------------------------- PLBCMP - Modified the GETMODE/SETMODE instructions to support a new keyword named DEFAULTSCHEMA. - Added a new PLB instruction named PROFILER. This instruction has been implemented to allow the collection of profiler data to be started/stopped under program control FORMAT: