Our annual subscription service started in 2005 and it is now time for most of you to renew. eXpress++ upgrades are not available other than through this subscription plan.
If you are a new eXpress++ owner, then your first year of subscription is included with the product and starts from the date that you purchased the product.
For all other eXpress++ owners, you must purchase the subscription to attain access to updates. With this service, updates will now become available on an as-needed basis, rather than waiting for releases. In the past, changes to eXpress++ did not become available to eXpress++ users until after a lengthy period of beta testing. With the subscription service, changes become available as soon as they are completed.
The source will be available by FTP or HTTP download only to paid-up subscribers.
Effective March 1, 2008, only paid Subscribers will have access to the Subscriber forum of the WebBoard, the NewsGroups and E-Mail notifications. A new Announcements forum will be used to announce new updates.
The most current version is eXpress++ 1.9 build 249. This has been tested with Xbase++ 1.8, 1.82 and 1.9.
The 1-year subscription price is $249.00.
The 2-year subscription price is $399.00.
Go to Order Page to
place your subscription order.
---------------- New to 1.9 (build 249) ---------- 1025. Added a sample program in .\SAMPLES\DESIGN that demonstrates how to use the NEW DESIGN mode. This new design system is in DCDESIGN.DLL. Bobby Drakos insisted that this feature be promoted and shared with other eXpress++ users because it saves him hours of time every week. 1024. Improved defect tracker. See .\SAMPLES\TRACKER\TRACKER.PRG. Better exception display and now has ability to stay in program after an error by clicking on BREAK. 1023. Fixed bug when using DCGETOPTIONS BUTTON clause and scaling. Buttons would not fit onto dialog correctly. 1022. Fixed bug in @ DCBROWSE when using DC_AutoRestoreBrowse() and scaling. Browse column widths would not restore properly. 1021. The .\SAMPLES\TOOLBELT directory contains an example of how to build a toolbelt onto a side status bar using a DCBROWSE and mouse-over highlighting. This uses bitmaps, a custom handler, data tooltips, presentation parameters and other techniques to give a nice visual presentation. 1020. Fixed problem of Validation getting subverted when a dialog is minimized and normalized more than one time in succession. 1019. Fixed problem of EventSpy.Dll sometimes locking up the program when using DC_ReadGuiDebug(2). Also added support for a new environment variable that can be used to invoke the event spy rather than changing source code: SET DC_READGUIDEBUG=Y 1018. Added 2 new parameters to DC_MoveObject() - nGridRows, nGridCols. 1017. Added new GETTEMPLATE clause to DCGETOPTIONS. Gets are automatically sized to the number of characters in the associated variable. This does not work as well for proportional fonts and for fixed fonts, therefore GETTEMPLATE sets the template character that is used to determine the size of a DCGET when using a proportional font. The default is 'W'. 1016. Fixed a bug in @..DCSAY. The SAYFONT can now be a code block. 1015. Added new function: DC_DbRecordCompare(). This compares two record objects (create by DC_DbRecord()) for an exact match of the data in all fields. 1014. Fixed a regression bug that sometimes caused DCGET .. POPUP to not set focus back to the Get object. 1013. New function: DC_MsgBoxEscape(). This is a Get-Set function that determines the behavior of the ESCAPE key when using DC_MsgBox() or DCMSGBOX. DC_MsgBoxEscape(.t.) always makes DC_MsgBox() return FALSE and CHOICE = 0. Default is .f. 1012. Fixed a few bugs in DC_MapDirections() - MICROSOFT, and added support for YAHOO and MAPQUEST maps. 1011. Added support for the Bullzip PDF Printer driver when using the DCPRINT ACROBAT feature. This is a free PDF driver that displays no annoying screens or embeds messages in the PDF file. The FREE version of Bullzip can be acquired at http://www.bullzip.com. It requires that GhostScript be installed on the workstation. Ghostscript can be downloaded at http://www.bullzip.com/download/gsl/gslite.exe. The DCPRINT system uses the "Bullzip.PDFPrinterSettings" ActiveX COM object to control the behavior and redirect the output to a file that can work with the Acrobat preview system. 1010. CutePDF driver for DCPRINT ACROBAT is NO LONGER supported. This caused too many problems. Resolving them would require users to spend money. BullZip was a much better solution. 1009. Added a new command GETSETTHREADFUNCTION to DCDIALOG.CH. This is similar to GETSETFUNCTION, except it is thread-safe. 1008. The .\SAMPLES\WIZARD directory contains a sample program that is a basic object-oriented template for creating wizards. 1007. Fixed a bug that causes a runtime error when using the DROP clause on a DCPUSHBUTTON. ---------------- New to 1.9 (build 248) ---------- 1006. Fixed a regression bug (introduced in build 246) that causes messages not to display correctly. Item 993 below has been removed. 1005. Fixed a regression bug (introduced in build 246) that causes the decimal key to function incorrectly in the International version of Xbase++. ---------------- New to 1.9 (build 247) ---------- 1004. Fixed a bug that could sometimes cause a validation to be ignored under very special cirmcumstances when clicking out of the application and then back into it again. 1003. Greatly improved the performance of DCPRINT..EXCEL, DC_Array2Excel(), DC_AdsCursor2Excel() and DC_WorkArea2Excel(). Runs about 50 times faster (thanks to Steve Poore and Regan Calkwell). 1002. Modified DC_GuiPopDate_2() to use DCSTATIC objects for the buttons instead of DCPUSHBUTTON..FANCY objects. This reduced the number of objects on the screen and improved the speed of the calendar popup. It also fixed a problem with double-clicking a date not always selecting that date and exiting. 1001. Fixed a bug. The DCGUI_PARENTHEIGHT and DCGUI_PARENTWIDTH manifests would not work for sizing an object unless using pixel coordinates. It now works with text-based coordinates. 1000. Added new TAGGING feature to the DCBROWSE system. This system provides tagging of records or array elements when using the mouse and the Ctrl or Shift key. Ex: @ .. DCBROWSE .. TAGENABLE TAGELEMENT 11 TAGCOLOR GRA_CLR_RED, GRA_CLR_YELLOW See the example in .\SAMPLES\TAGGING 999. Fixed a bug that causes a tooltip to remain on the screen when a dialog is closed. 998. Added a new NOBITMAPS clause to the DCMENUBAR and DCSUBMENU commands. This will suppress the 20-pixel space on the left side of each menu item reserved for bitmaps when using the OWNERDRAW option. 997. Fixed a regression bug that causes DCSAY .. {||..} objects on a groupbox not to refresh correctly. 996. Fixed a regression bug that sometimes causes a runtime error when a dialog window is minimized. 995. Fixed a bug that causes the object in focus to be validated when the "main" dialog is minimized. Restoring the window also restores focus to the object. ---------------- New to 1.9 (build 246) ---------- 994. Fixed a bug in @ DCPUSHBUTTON .. STATIC. The FOCUSCOLOR clause would not reset the focus color when the mouse was moved off the object. 993. Improved the message dispatch system to test that the message being sent is coming from the object that is in focus, otherwise it is not displayed. This prevents messages associated with a Browse column from being displayed when a different object has focus. 992. Minimizing a window to the desktop now saves and restores the object in focus when the window is restored. 991. The DC_AutoRestoreWindow() function now accepts a third array parameter. If the 3rd array parameter is .TRUE., then the default for restoring windows will be ON, and the override clause of DCREAD GUI is NOAUTORESTORE. If the 3rd array parameter is .FALSE., then the default for restoring windows will be OFF, and the override clause of DCREAD GUI is AUTORESTORE. 990. Added a new :asString() method to DC_XmlNode(). This returns an XML tree as a character string. See sample SAFT.PRG program in .\SAMPLES\XML. 989. Added support for the CutePDF driver when using the DCPRINT ACROBAT feature. This is a free PDF driver that displays no annoying screens or embeds messages in the PDF file. It requires that GhostScript be installed on the workstation. To install, run the .\CUTEPDF\CuteWriter.Exe install program. Ghostscript can be downloaded at http://mirror.cs.wisc.edu/pub/mirrors/ghost/GPL/current/. The install file is gs861w32.exe. 988. Added a new SCROLLBARS clause to the DCGETOPTIONS command. This will cause scrollbars to automatically appear in the drawingArea of the dialog window if a child object is displayed outside the drawing area. Ex: DCGETOPTIONS SCROLLBARS XBP_SCROLLBAR_VERT+XBP_SCROLLBAR_HORIZ 987. Fixed a bug that causes the object in focus to be validated when the parent dialog is minimized. Restoring the window also restores focus to the object. 986. The .\SAMPLES\MOBILE directory contains a program designed to be used on a mobile device such as a PDA, Pocket PC, etc. The application is intended to run on a Terminal Server or Citrix server and the Mobile device uses the Terminal Server thin-client or the Citrix thin-client to connect to the remote server via a wireless connection. Also supports scaling for different size PDAs or monitors. 985. Added a new class: DC_MapDirections(). This class provides a simple interface for calling the Google or Microsoft Mapping website to provide driving directions. See the sample program in the .\SAMPLES\MAPDIR directory. 984. Fixed a bug in DCBROWSECOL TYPE XBPCOL_TYPE_BITMAP that causes a runtime error when using pixel coordinates. 983. Added a new command: DCSPLITBAR. This is used to create a vertical or horizontal bar to be used for proportionally resizing adjacent screen objects. Look at the sample program in the .\SAMPLES\SPLITBAR directory. Thanks to Terry Wolfe for helping with this. 982. Added a new COLUMNBREAK clause to the DCSUBMENU and DCMENUITEM commands. This causes successive menu items to appear in a new column of the drop-down or popup menu. Look at the sample program in the .\SAMPLES\MENU directory. 981. The .\SAMPLES\SOAP directory contains a utility program that makes it easier to develop SOAP and Web Services client applications. It allows the developer to experiment with a SOAP Service or a WEB Service in an interactive dialog, rather than requiring lots of code changes to try to work through problems. Bobby Drakos says "I think any eXpress user dealing with SOAP should know about this." 980. The .\SAMPLES\SERVICES directory now contains the source code and an example of a subsystem for managing up to 10 services that can be started, stopped or paused. This is intended to be a seperate EXE that constantly runs and manages background tasks needed in applications. Examples of tasks would be: 1. Send Email from records inserted into a database by main app. 2. Check for orphan records in databases and remove them. 3. Import data from external systems. 4. Check POP servers for email and route the emails to a document management system. 5. Send notifications when events are overdue. 6. Find duplicate records and send a notification. 979. Added a new RESIZECOLUMNS clause to the DCBROWSE command. This causes columns to be resized proportionally as the browse width is resized. 978. Added a new FIT clause to the DCTOOLBAR command. This causes the toolbar to be resized to the sum of the width of all the child buttons. See the sample program in .\SAMPLES\TOOLBAR. 977. Added a new ALIGN clause to the DCTOOLBAR command. If the ALIGN DCGUI_ALIGN_RIGHT clause is used, then the column coordinate defines the right-most position of the toolbar. If the ALIGN DCGUI_ALIGN_CENTER clause is used, then the column coordinate defines the center of the toolbar. See the sample program in .\SAMPLES\TOOLBAR. 976. DC_RegWrite() and DC_RegQuery() now handle DWORD datatypes. Thanks to Markus Walter. 975. Added 2 new parameters to the DC_GetWhen() function.is an ID or array of IDs to evaluate the WHEN/HIDE clause. is an GROUP or array of GROUPs to evaluate the WHEN/HIDE clause. Ex: DC_GetWhen( GetList,,,{'BUTTON1','BUTTON2'} ) DC_GetWhen( GetList,,,,'GROUP1' ) 974. Added a new function: DC_BrowseColor(). This is a Get-Set function that is used to establish the default colors for alternate rows of all DCBROWSE objects. These colors will be invoked only if the COLOR clause of DCBROWSE is not used. Ex: DC_BrowseColor( { nil, GRA_CLR_WHITE, nil, GRA_CLR_CYAN } ) 973. New manifest constants DCGUI_PARENTHEIGHT and DCGUI_PARENTWIDTH may be used with the SIZE clause of DC* commands. This will set the size of the object to the size of the parent less any adjustment. Example: @ 0,0 DCSTATIC TYPE XBPSTATIC_TYPE_TEXT SIZE 200,300 OBJECT oStatic @ 10, 10 DCBROWSE oBrowse PARENT oStatic ; SIZE DCGUI_PARENTWIDTH - 20, DCGUI_PARENTHEIGHT - 20 972. The .\SAMPLES\DOCUMENT directory now contains the source code and an example of a subsystem for attaching external documents in an application. Only about 8 lines of code are needed to add this document system to a parent object such as a tabpage. This allows external documents of any type to be attached to any record of any database that has a field named RECORD_ID, C, 20. Also supports recording of voice clips and scanning of documents. Third-party AudioCtl.Dll is required for voice recording and EzTw32.Dll is required for scanning. 971. Created a new set of DC_Xbp*Super() classes in a new file named _DCSUPER.PRG. All DC_Xbp*() classes now inherit from the super classes. The purpose of this change is to provide eXpress++ users with the ability to make modifications to eXpress++ classes for adding additional iVars or methods. The source code in _DCSUPER.PRG is intended to be maintained by the eXpress++ user, not Donnay Software. 970. DCPUSHBUTTON .. FANCY now supports the color clause, however only the XbpStatic() portion of the fancy button will change color, not the XbpPushButton(). 969. DC_GetRefresh( oXbp ) will now refresh oXbp and all objects that are descendents of oXbp. 968. Fixed regression problem from build 240. Now can do a DCGET of a MEMVAR->myvariable. 967. Improved behavior of descending sorting when using the SORT clause of DCBROWSECOL. 966. Added new POPWHEN and POPHIDE sub-clauses to the POPUP clause of @..DCSAY..GET and @..DCGET. 965. DC_Dbu(), Display Structure and other dot-prompt features now support the following field types: C - Character N - Numeric D - Date L - Logical M - Memo A - Array X - Binary C V - Binary M I - Integer T - TimeStamp Y - Currency F - Double Q - Character-Unicode/VarLen W - Character-Unicode/Fixed X - Binary V Z - Blob 964. Fixed a bug in DCSUBMENU. Caption may now be a code block. 963. EZ-Twain support. A set of TWAIN_* wrapper functions are now included in _DCFUNCT.PRG for using Twain devices. The twain DLL is located in .\SAMPLES\TWAIN. An example of how to use the TWAIN_* functions is in .\SAMPLES\DOCUMENT\DOCUMENT.PRG. 962. The popup button on a GET now is disabled after being activated and then enabled again when returning from the code block. This prevents problems when double-clicking the button. 961. Added new function: DC_GetValidateOnChange(). This is a get-set function that is used to modify the behavior of GET validations. If .TRUE., then the validation code block will only be called if the value of the Get has changed. The default is .FALSE. 960. Added 2 new clauses to all DC* commands: DRAG [DIALOG ] DROP [CURSOR ] These clauses provide for a simple interface for dragging and dropping operations between objects in the same window or objects in windows of other threads. See the .\SAMPLES\DRAGDROP\DRAGDROP.PRG sample. 959. Added new 2nd parameter to DC_BrowPres(). This is used to set the frame type for the hilighlight bar. Thanks to Bobby Drakos for contributing this information and taking the time to figure out the constants needed. Each frame type is defined in DCDIALOG.CH as a DCGUI_BROWSEFRAME_* constant. Example: @ DCBROWSE .. PRESENTATION ; DC_BrowPres(,DCGUI_BROWSEFRAME_THICK_RECESSED) 958. Fixed problem with DCPUSHBUTTON FANCY not displaying text correctly when using the ALIGNCAPTION clause. 957. Eliminated flickering and child object display problems when clicking between tabpages that have a WHEN clause. 956. DC_GetRefresh() now accepts a new type of inclusion/exclusion as the 3rd parameter as an array. ---------------- New to 1.9 (build 245) ---------- 955. Added new parameter to DC_PopCalc() and DC_GuiPopCalc(). This removes the decimal point from the calculator. Thanks to Bobby Drakos. 954. Added new parameter to DC_MsgBox(). Added new ALWAYSONTOP clause to DCMSGBOX. Changed DCMSGBOX command to allow it to be used in a code block by wrapping it in parenthesis: Ex: {||(DCMSGBOX 'Do not do that' ALWAYSONTOP)} 953. Fixed several regression errors in build 244. ---------------- New to 1.9 (build 244) ---------- 952. Added new Dot-Prompt command: SQLSELECT. This command uses the function DC_AdsRunSQL() to execute an SQL SELECT statement in a new work area. EXAMPLE: SQLSELECT * FROM XTEST 951. Added new Dot-Prompt command: DUSE. This command is similar to USE except the file is opened via an ADS connection to a data-dictionary. For DUSE to work, an ADS dictionary connection must first be made and registered via DC_AdsSession(). 950. Added documentation for DC_Xml*() functions and classes. 949. Added new function: DC_JPGSize(). This will return the size of a JPG file. It is much faster than using the XbpBitMap() class to determine the size. Thanks to Brian Wolfsohn. 948. Improved UI of some dot-prompt commands: COPY, APPEND, COUNT, ; DELETE, etc. 947. Fixed a bug in Data Tooltips. Bitmaps will no longer be truncated if the browse is positioned close to the right or bottom of the screen. 946. Fixed a bug with a valid on an EditProtected Get firing if it is the first Get in a GetList or if it somehow was able to temporarily get focus even if protected. 945. Changed the default value for DC_ToolTipThread() to 2. This will insure that there is only 1 tooltip thread running. 944. Added new clauses to the DCTABPAGE command: MINIMIZEDCOLOR - Sets the color of tab when minimized MAXIMIZEDCOLOR - Sets the color of tab when maximized These clauses will override any settings of DC_TabPageColor(). 943. The BARFONT clause of DCSUBMENU now works when using the OWNERDRAW feature. Added new FGCOLOR and ITEMFONT clauses to allow more visual options when using the OWNERDRAW feature. Added more COLOR and FONT clauses to the DCMENUBAR command to set the default colors and fonts for submenus when using the OWNERDRAW feature. 942. Added new function: DC_TabPageColor(). This is a Get-Set function that is used to automatically set the color of Maximized and Minimized Tabpages so that the currently selected tab may be a different color than unselected tabs. 941. Fixed regression bug in DC_PopColor() when not using Safe mode. 940. The Browse Footer now prints properly in DC_PrintBrowse(). 939. The BROWSE feature of DC_ArrayView() now allows sorting on any column. 938. Removed the call to DC_GetWhen() when an xbeBRW_ItemMarked event is detected in the event loop. This was causing lots of flickering on some applications when navigating the browse. 937. Added a new WHEN clause to the DCBDEBUG command. This will cause the debug info to be displayed only when the codeblock returns .t. Ex: DCBDEBUG i, oInfo WHEN {||i==16} 936. Fixed a bug in DC_IsAppRunning() that caused it sometimes to fail to determine if an application is running. 935. New function: DC_EditControlLastFocus(). This returns a pointer to the last edit control that had focus. Handy for returning to a Get after hitting a hot key or clicking a pushbutton. 934. DC_InspectObject() will now execute methods when double-clicking the method name in the browse. The returned value will be displayed. 933. Added support for ADT files and fields in Xdot.exe and basic eXpress++ functions when using the ADSDBE. Run XDOT /? to see new options. 932. Added new function: DC_KeyString2Num(). This is used to translate a string that defines a key to a numeric Xbase++ equivalent. This is handy for data-driven applications. Ex: DC_KeyString2Num('Shift-F10') -> xbeK_SH_F10 Ex: DC_KeyString2Num('Ctrl-F10') -> xbeK_CTRL_F10 Ex: DC_KeyString2Num('Control-F10') -> xbeK_CTRL_F10 931. Added new clauses to the DCSUBMENU command: BEGINMENU, ENDMENU, ITEMMARKED, ITEMSELECTED, SUBITEMFONT 930. Added new clauses to the DCMENUBAR command: BEGINMENU, ENDMENU, ITEMMARKED, ITEMSELECTED, SUBITEMFONT 929. Fixed a bug in DC_Resize() that caused corruption of the display after 2 windows are minimized and then normalized. 928. Fixed a bug in @..DCPUSHBUTTON when using the BS_MULTILINE option of the ALIGN clause and also a WHEN block. Caption would not format correctly. 927. Added new clause to DCGETOPTIONS command: RESTOREDEFAULTSBUTTON. This will create a right-click area in the lower left corner of each dialog. Clicking in this area will popup a message box allowing the user to restore the screen position and size to the defaults. This is used in conjunction with DC_AutoRestoreWindow(). 926. Added new function: DC_AdsCursor2Excel(). This is used to create an Excel spread sheet from an Ads Cursor handle. Also added an "Excel" button to DC_AdsSqlQuery() to output an SQL query to Excel. 925. Fixed a bug in DC_GetDestroy(). It was not releasing some GC objects and thereby consuming memory. 924. Added new DCPRINT commands to improve document control. (compatible only with Xbase++ 1.9 and later) : DCPRINT STARTPAGE - Starts a new page within a print job. DCPRINT ENDPAGE - Ends a page within a print job. DCPRINT ORIENTATION - Change orientation within a print job. DCPRINT PAPERBIN - Change paper bin within a print job. DCPRINT FIXED ON/OFF - Control fixed mode. See the example in .\samples\printer\document.prg 923. Made improvements to the DCPRINT system to provide the ability to print documents that have "wrappable" text with imbedded merge-data and font changes. See the example in \exp19\samples\printer\textwrap.prg 922. Added new function: DC_ArrayTrim(). This is used to trim NIL rows and NIL columns from a 2-dimensional array. Useful when converting a multidimensional array that contains a lot of NIL data into an array that can be sent to an Excel spreadsheet. 921. Added new EXCEL clause to DCPRINT ON. This will cause the print output to go to an Excel *.XLS file. Note: this will work with any print job, however, the Excel data is relatively useless if the print job is not a columnar-style report. Supported in Xbase++ 1.0 and above. See the example in \exp19\samples\printer\excel.prg. 920. Added new function: DC_Array2Excel(). This is used to create an Excel spreadsheet from the data in a 2-dimensional array. Supported in Xbase++ 1.9 and above. See the examples in \exp19\samples\excel\test.prg and \exp19\samples\ads\adssql.prg. 919. Added new function: DC_WorkArea2Excel(). This is used to create an Excel spreadsheet from the data in a workarea. Supported in Xbase++ 1.9 and above. See the examples in \exp19\samples\excel\test.prg and \exp19\samples\ads\adssql.prg. 918. Added new function: DC_AdsSession(). This is used to create an ADSDBE DacSession for the current thread to be later used by DC_AdsStatement() or a regular dbUseArea(). 917. Added new class: DC_AdsStatement(). This is used to accept a SQL statement and create a SQL cursor that can be navigated with standard DBE navigation methods, like dbSkip(), dbGotop(), @ DCBROWSE, etc. This uses a new feature of Xbase++ 1.9 that really simplifies the process of using SQL queries in an Xbase++ application. Nothing else is needed except the ADSDBE and Xbase++ 1.9. Run the \exp19\samples\ads\adssql.exe program to see a demonstration of the simplicity and the power of this Xbase++ 1.9 feature. 916. Fixed a regression error in DCBROWSECOL where Unselectable columns would not be colored properly when using the SORT clause. 915. Fixed a regression error in DCPUSHBUTTON..STATIC that occurred starting in build 242 that was causing caption text to not align correctly. To clarify alignment options for DCPUSHBUTTON and DCADDBUTTON: You CANNOT use the BS_* alignment options with DCPUSHBUTTON STATIC buttons. You CAN use the XBPSTATIC_TEXT_* alignment options with DCPUSHBUTTON STATIC but not with the standard DCPUSHBUTTON. 914. DC_ArrayView() now has a pushbutton for displaying the array in Browse-Style format instead of Tree-View format. 913. Fixed regression bug. ENTEREXIT will now work when the last GET is protected. ---------------- New to 1.9 (build 243) ---------- 912. Added new function: DC_BrowseGetList( ). This aids in debugging dialog screens by providing a browse-view of a GetList. 911. DCPRINT ON IMAGEWRITER and DCPRINT ON ACROBAT clauses now delete all *.$$$.MDI and *.$$$.PDF temp files. 910. Added new IMAGEWRITER clause to the DCPRINT ON command. This clause works similar to the ACROBAT clause except it uses the "Microsoft Office Document Image Writer" printer driver. This driver is automatically installed when Microsoft Office is installed and automatically displays the print job in a preview window. Run the SAMPLES\PRINTER\INVOICE.EXE sample and click on Print. Added new DC_PrintPreviewImageWriterOpt() get-set function to set default options for this feature. 909. Fixed a bug that prevented CARGO "CANCEL" from working on a DCPUSHBUTTON or DCADDBUTTON with the FANCY clause. 908. Added new commands: DCSETRESIZE - Changes the default resize method. DCSETFONT - Changes the default font. DCSETCOLOR - Changes the default color. DCSETSAYOPTION - Changes the default DCSAY options. See the example(s) in SAMPLES\SET 907. The DCPRINT system is now thread-safe. This means that multiple print jobs can be run simultaneously in different threads. 906. Array browser in DCBDEBUG now calls a browse-style browser/editor if the array is a symmetrical, multi-dimensional array. Double-Click headings to optimize columns. 905. Improved DCPICKLIST to allow keyboard navigation. 904. Added new DCRTF command to DCPRINT.CH. This is used to imbed RTF in a print job. 903. Added new ENTEREXIT clause to the DCGETOPTIONS command. Added new NOENTEREXIT clause to the DCREAD GUI command. 902. Fixed some commands in DCSTD.CH that would cause fatal errors on dot prompt commands. 901. Added new function: DC_GetIDDefault(). This function will return an ID for an object based on the name of the variable passed. It is used in DCDIALOG.CH to automatically assign a default ID when getting data that is an aliased field. Example 1 : @..DCGET MYFILE->name This will assign an ID of GET_MYFILE_NAME Example 2 : DCBROWSECOL FIELD MYFILE->name This will assign an ID of COL_MYFILE_NAME 900. Added NORESIZE and NORESTORE clauses to @..DCDIALOG command. 899. Fixed several regression errors from previous builds: a. DC_GetRefresh() did not repaint bitmaps created with DCBITMAP. b. Corrected Lastkey() problem in DC_DbEdit(). c. Fixed a problem in DC_GrumpBrow() - Thanks to Stu Fraser. d. Corrected a problem with DCBROWSE objects blinking. e. Corrected problem with menus flickering. f. Refreshing a bitmap with DC_BitmapDraw() will now clear the screen if the bitmap does not exist. g. Datatooltips display correctly now if the data is a memo field. h. Fixed error that occurs occasionally in a DCTREEVIEW. i. Fixed bug where messages on DCMENUITEMs do not always display in message box. j. Fixed bug in DC_GetProgress() that could cause a divide by 0 error. k. Fixed bug that could cause error if using @..DCGET..POPVALID in an object that is a cell editor. l. Fixed error that could occur in DC_AdsSqlQuery() if the ADSSQL.DBF file did not exist. m. Fixed bug in DC_RangeCheck() that would cause an error if the values passed are not numeric. ---------------- New to 1.9 (build 242) ----------- 898. Added a new 6th element to the DCGETOPTIONS .. SCALEFACTOR array. This is a logical element that determines whether windows that are Auto-Resized are also Auto-Scaled. This means that a window that has been resized to 50% larger will be automatically re-scaled 50% larger the next time it is created. 897. Added new NORESTORE clause to @..DCAPICK and parameter to DC_APick(). 896. Fixed several bugs related to DCPUSHBUTTON .. STATIC. 895. See new RMCHART sample submitted by Michael Rudrich: SAMPLES\RMCHART\RMCHART.PRG. Requires free RMCHART ActiveX control to be installed. 894. Added new parameter to DC_GetBitmap() to scale the bitmap to a specified percentage or size. 893. Added new options SCALEBITMAP clause to the @..DCPUSHBUTTON and @..DCADDBUTTON commands. This will shrink or enlarge a bitmap caption to fit exactly within the button size. Note: bitmaps must be 24-bit (hi-color) for this to work correctly. 892. Added new optional SCALEFONT clause to the RESIZE clause of all commands. This will automatically scale the font size up or down when the object is resized. Run samples\resize\resize.exe. 891. New sample programs: samples\activex\spellchk.prg - MS Word Spellchecking in a DCMULTILINE. samples\rtf\test.prg - DCRTF command. 890. DC_PopColor() has been improved to display the color-safe palette in a better format - thanks to Brian Wolfsohn. 889. Fixed a regression bug caused by Xbase++ 1.9. Tooltips on browse columns now work correctly. 888. Added new parameter to DC_MsgBox(). This overrides the setting of DC_AutoRestoreWindow(). Also added new NORESTORE clause to the DCMSGBOX command. 887. Added new function: DC_ZoomTransparent(). This function is used to cause a dialog window to go from 0% to 100% transparency or from 100% to 0% transparency at a specified time period. Run XDEMO.EXE to see the main window fade in. 886. Added new function: DC_SetWindowTransparency(). This function will set a dialog window to any transparency from 0% to 100%. 885. Added new function: DC_UNC2Drive. This function returns the local mapped path from a UNC path. 884. Added new function: DC_GetRefreshBlock(). This is a Get-Set function that is called inside DC_GetRefresh() to determine where in your application refreshes are being called. Example: DC_GetRefreshBlock( {|x|(dcbdebug x)} ) 883. Added new function: DC_IsDescendant(). This function determines if an object is a descendent of another object, ie a child, a grandchild, a great-grandchild, etc. 882. Added new ONCLICK clause to the DCGETOPTIONS command. This is used to assign a codeblock to evaluate any time the left mouse button is clicked in the dialog window. 881. Added new command line parameters to XDOT.EXE. Run XDOT.EXE /? for help. 880. Added new GOBOTTOM clause to @..DCMULTILINE. 879. Added :setCaption() method to DC_XbpTabPage(). 878. Added support for the Danish Language. Thanks to Henrik Møllnitz. 877. The DCBDEBUG window will now allow double-clicking in a stack column to go to the line of code in the default source editor. See the example in \exp19\samples\debug. 876. Added new ALWAYSONTOP clause to the DCBDEBUG command. 875. Fixed a bug in DC_RecSize(). It returned the wrong size. ---------------- New to 1.9 (build 241) ----------- 874. Includes demonstration version of eXpress++ Instant Messenger system. Read \exp19\im\readme.txt. I eXpress myself ... therefore IM 873. Tested with Xbase++ 1.9 (build 331). 872. Added new ADDBUTTONS clause to DCPRINT ON. 871. Added new DCSLE command. ---------------- New to 1.9 (build 240) ----------- 870. Added automatic record-locking when creating a DCGET that is aliased into a database. Ex: @ .. DCGET MYDATABASE->myfield ; VALID {||IIF(Empty(MYDATABASE->myfield), ; MYDATABASE->myfield := 'xxx',nil), .t. } If the record is not already locked, then it will be locked and unlocked in the Get-Set code block and the Validation routine. 869. Added new DCRTF command for creating windows that support RTF. 868. Fixed regression bug that caused multiple problems involving navigation with the TAB key or Up/Down array keys. 867. New function: DC_AvailableDrives() 866. Fixed bug in DC_SendMailToDefault(). ---------------- New to 1.9 (build 239) ----------- 865. Added new KEYDROP clause to @ .. DCGET .. COMBO. This causes the combo box to drop down on pressing the first key in the GET. 864. @ DCGUI_ROW, DCGUI_COL now works correctly after a @ .. DCSAY .. GRASTRING .. SAYSIZE 0. 863. A MESSAGE clause on an EDITPROTECTED get now displays the message when clicking on the get with the mouse. 862. The vertical bar text on OWNERDRAW submenus is no longer truncated if it does not fit the bar area, instead it is not displayed. This improves the visual effect of pulldown menus with long titles. 861. Added new clauses to the DCMENUBAR and DCSUBMENU commands to support colors when using the OWNERDRAW feature. Added new parameters to DC_XbpMenuConfig() to control default colors and fonts. 860. Added new function: DC_MoveCursorToObject(). This will position the mouse cursor in the center of an object. 859. Tooltip system now works correctly with 2 monitors. Thanks to Jack Duijf. 858. Added three new parameters to the DC_GetPopupCaption() Get-Set function for controlling the defaults for POPUP buttons on DCSAY..GET and DCGET objects. Param 4 - Default width (in pixels) Param 5 - Default height (in pixels) Param 6 - Default hotkey 857. The Magic Help tooltip system now includes two new functions: Thanks to Terry Wolfe. DC_AMagicHelp() - A Get-Set function that points to the magic help array. DC_KillMagicHelp() - Used to terminate the tooltip thread. 856. Added 3 new parameters to DC_PopColor(): 1. (default .FALSE.) presents only 216 colors to choose from. This is the color-safe palette used in Web applications and Citrix/Terminal Server clients that choose only 256 colors. 2. (default .TRUE.) makes the dialog modal. 3. is the parent of the window. Default is AppDeskTop(). 855. Included an example of a User-Definable Toolbar in XDEMO.EXE. This sample shows how to build a menu system that allows the user to pick any item from the menu and add it to the toolbar. Click on the TreeView (first button) on the toolbar. 854. Integrated Joe Carrick's MxPushButton class into eXpress as a new set of commands: DCMXPUSHBUTTON and DCMXADDBUTTON. The support code is in DCMXBUTT.DLL. The default DLL is crippled to allow the buttons to work for only 15 minutes. To get full capability, it is necessary to purchase MxPushButton from Joe Carrick and then rebuild DCMXBUTT.DLL by running BUILD*.BAT in the SOURCE\DCMXBUTT directory. MxPushButton provides a much improved pushbutton class including support for XP-Style buttons. The price is very reasonable and includes source code. This product adds value to every eXpress++ application. Send an email to Joseph P. Carrick [ceo@youngdale.com] to order MxPushButton. To see a demonstration of DCMX* commands, look at the MxPushButton sample in XDEMO.EXE - Sample Group 6. Also select the TreeView button on the main menu of XDEMO.EXE and right click a tree item to build a custom toolbar. 853. Fixed a bug that causes the TAB key to not properly evaluate WHEN clauses when pressed in a DCGET. 852. Created a new RESTEST program in \exp19\samples\resize. Use this program to test the behavior of resizing rules. 851. Updated the MODIFY STRUCTURE command, DC_ModStru() and DC_StruUpdate() to no longer delete the associated .CDX file when updating a structure. Instead, the .CDX is renamed to .CDK. 850. Added new functions (thanks to Cliff Wiernik): DC_Dec2LongInt() - Converts a Long Integer (32 bits) TO binary character representation DC_XorBitsLong() - Performs an exclusive OR on 2 long integer (32 bit values) values DC_Hex2Bin() - Converts Hexadecimal numbers to binary 849. Added a 2nd parameter to DC_SpawnUrl(). This is a logical parameter (Default is .FALSE.) that is used to establish whether the spawned program is run in the background. 848. Added an 11th parameter to DC_PrintPreviewAcrobatOpt(). This is a logical parameter (Default is .TRUE.) that is used to establish whether eXpress++ will automatically erase temporary PDF files. 847. Improved @..DCPROGRESS to provide more options for the PERCENT text that is displayed in the progress bar. Text no longer is displayed in a separate object. Text font and color is now selectable via new FONT and PERCENTCOLOR clauses. New RADIUS, OUTLINE and DYNAMIC parameters improve appearance. Progress bar is automatically repainted when another dialog is moved over it. See the new Progress Bar example in XDEMO.EXE - Sample Group 6. 846. Included a new sample of a Printer "Front-End" dialog that can be used with all print jobs. This "standardized" dialog allows the user to select default print options including sending the print job to an email recipient. Look at the INVOICE.PRG example in \exp19\samples\printer. 845. Fixed a bug in DC_IsDir() to make it work correctly with UNCs. 844. Fixed a bug in the Dot-prompt USE command that would not open files if the DEFAULT directory or PATH contained a UNC. 843. Added new ACTIVATEITEM clause and NAME clause to the DCSUBMENU command. ACTIVATEITEM can be used to run an Indexed procedure in lieu of ACTION clauses on each DCMENUITEM command. NAME is applied to the :setName() method of the menu object to be retrieved later. Example: bRunProc := {|nItem,nIndex,oXbp,nName|nName := oXbp:setName(), ; RunProcedure( nName + nItem )} DCSUBMENU oMenu1 NAME 1000 ACTIVATEITEM bRunProc DCMENUITEM 'Item 1' PARENT oMenu1 DCMENUITEM 'Item 2' PARENT oMenu1 DCSUBMENU oMenu1 NAME 2000 ACTIVATEITEM bRunProc DCMENUITEM 'Item 1' PARENT oMenu2 DCMENUITEM 'Item 2' PARENT oMenu2 842. Added new function: DC_BitmapResourceFile( ncaResfile ). This is a Get-Set function that is used to establish a list of resource DLLs for finding bitmaps. All bitmaps in eXpress++ are loaded via the function DC_GetBitmap(). This function always returns a bitmap object of type XbpBitmap(). This function now runs through a loop to try to load resources from Dlls set with DC_BitmapResourceFile() if the named resource is not linked to the EXE, therefore bitmaps with a numeric resource ID can now be in multiple DLLs and do not need to be linked to the .EXE. Example: nResDll1 := DllLoad('MYBITMAPS.DLL') // load my custom bitmaps nResDll2 := DllLoad('DCRES.DLL') // load eXpress++ bitmaps DC_BitmapResourceFile( { nResDll1, nResDll2 } ) DCADDBUTTON CAPTION MYBITMAP_PERSON // defined in MYBITMAPS.DLL DCADDBUTTON CAPTION BITMAP_HELP_M // defined in DCRES.DLL This eliminates the need to use the RESFILE clause when defined bitmap captions. Also, if the RESTYPE clause is not used, then the resources must be of type BITMAP, GIF, JPEG, BMP or PNG in your resource DLLs. Run XDEMO.EXE to see that bitmaps are now loaded from DCRES.DLL. 841. Included many new 25 x 25 bitmaps in sub-directories under BITMAPS\MOREBITMAPS. These, and the bitmaps in BITMAPS are now all included in EXPRESS.RES and DCRES.DLL. Thanks to Bobby Drakos. 840. The DCSUBMENU and DCMENUITEM commands now allow for the parent to be a DCTREEITEM object, thus providing a means to build both pulldown menus and Treeview menus from the same source code. See the example in XDEMO.EXE. Select File - Tree Menu from the main menu. This demo program also includes a methodology for creating a custom toolbar from the Treeview menu and saving the settings to the Windows registry. 839. Improved the DC_AdsSqlQuery() dialog to now allow for selecting data types. 838. The CHECKWHEN clause of DCMENUITEM is now supported in OWNERDRAW menus. 837. Added new function: DC_RecSize(). Use this in place of RecSize() to prevent "non-supported" errors when using the ADSDBE. This appears to be a regression in Xbase++ 1.9 836. Fixed regression problem that caused error when using sub-tabpages on tabpages. ---------------- New to 1.9 (build 238) ----------- 835. Added new GRAY clause to the DCPRINT BOX command. This causes boxes to be filled in grayed. Thanks to Rick Dalzell. 834. Fixed a bug in DC_DbGoPosition() that prevented a browse from navigating to the top record when moving the slider scroll bar to the top. 833. Added new parameter to DC_Scrn2ClipBoard() to allow printing only the contents of an object, rather than the entire screen. 832. Modified DC_XbpGet() class to allow for scoped dropdowns similar to Internet Explorer. See XDEMO.EXE - Sample Group 6 for an example of how to use @ DCGET .. COMBO to invoke this feature. 831. Added a new set of DC_SQL*() functions to improve support of eXpress++ applications that use SQLexpress. DC_SQLConnection() - Make a SQL connection DC_SQLCursor() - Create an SQL cursor DC_SQLGetSetBlock() - Create a Get-Set block for editing DC_SQLSortBlock() - Create a Sort block for a browse column. DC_SQLFieldBlock() - Create a Field block for browsing. DC_SQLDataSet() - Create a sub-set of an existing dataset. 830. Dramatically improved performance of all Ads*() function wrappers that call ACE32.DLL. 829. Added new ALWAYSONTOP clause to the DCGETOPTIONS command. This causes the dialog window to always display in front of all other dialog windows from all other applications. 828. Added version info to all DC*.DLLs. Now when viewing DLL info with operating system, version information will be displayed. 827. Removed DCLIPS.DLL from system. Stub functions from this DLL were moved to DCLIP1.DLL. 826. Added new functions: DC_HourGlassOn() and DC_HourGlassOff(). 825. Fixed a bug in OWNERDRAW menus. Disabled menu items now are painted correctly. 824. Added new function: DC_TagRecord(). This is used to tag/untag a record or group of records in a Browse. 823. Added new function: DC_ConfigDialogButtons(). Thanks to Cliff Wiernik. This allows the Maximize button to be disabled in an MDI window. Ex: DCREAD GUI EVAL ; {|o|DC_ConfigDialogButtons(o,DLG_BUTTON_DISABLEMAX)} 822. Added a new Touch-screen example in \exp19\samples\touchscr that demonstrates a scalable touch-screen application. Run PBUILD TOUCHSCR2.XPJ. 821. Fixed a bug in DC_Purge(). Index key builder was not returning a value. 820. Added new RESFILE clause to @..DCPUSHBUTTON, DCADDBUTTON, ; @..DCTABPAGE, @..DCSTATIC, @..DCDIALOG and DCPRINT BITMAP commands. This is used in conjunction with the RESTYPE clause. ---------------- New to 1.9 (build 237) ----------- 818. Tested with Xbase++ 1.9 beta (build 320). 817. Added a new function: DC_PrintImage(). This is a WYSIWIG printing function that prints the screen image of an object. For an example, run XDEMO.EXE then place the mouse over any object and press the middle mouse button. 816. Added new function: DC_IsDir(). 815. Conditional compiling has been inserted in the source code to replace ActiveX code, that previously used JazzAge, with new Xbase++ ActiveX code. If the source is compiled with 1.8 or 1.82 then Jazzage will be used, otherwise it is not required under 1.9. 814. Added new function: DC_XbpMenuConfig(). This is a Get-Set function that is used to configure the default colors and fonts for the OwnerDraw menus. Used only in Xbase++ 1.9. 813. Added Xbase++ 1.9 OwnerDraw feature to eXpress++ menu system for more eye-appealling pulldown and popup menus. This feature is enabled only when compiled in Xbase++ 1.9. New clauses added to DCMENUBAR command: OWNERDRAW BGCOLOR BARFONT BARCOLOR New clauses added to DCSUBMENU command: OWNERDRAW BARTEXT BARFONT BARCOLOR BGCOLOR Example: DCSUBMENU oFileMenu PROMPT 'File' BARTEXT 'File' ; BARCOLOR GRA_CLR_RED, GRA_CLR_YELLOW PARENT oMenuBar ; BARFONT '14.Arial Bold' Run the XDEMO.EXE program in .\bin19 to see an example of this new menu. 812. Added 2 new options to DC_PrintPreviewAcrobatOpt() configuration array: Element Type Description ------- ---- --------------------------------------------- 9 C Path to create temporary .PDF files 10 L .TRUE. if .PDF file is given same name as title. .FALSE. if .PDF file is given a cryptic name. 811. Modified the behavior of @..DCGET to automatically delete the marked text when pressing the Backspace key. This is more standard behavior in Windows applications. It also provides for special functionality such as "Autofill" to work correctly. See the "Autofill Get" sample in XDEMO.EXE - Sample Group 6. 810. Added new RESTYPE clause to @..DCPUSHBUTTON, DCADDBUTTON, ; @..DCTABPAGE, @..DCSTATIC and DCPRINT BITMAP commands. This provides support for bitmap resources of type BMP, PNG, GIF and JPEG that have been linked into a .RES file to be used as the caption. Example: @ .. DCPUSHBUTTON CAPTION 2000 RESTYPE GIF // myres.arc USERDEF GIF 2000 = FILE ".\GIFChart.GIF" 809. Added new OPTIONS clause to the @..DCRADIOBUTTON command. This provides checkbox visual options such as "Push-Like". Example: @ .. DCRADIO n VALUE 1 PROMPT 'Selection;1' OPTIONS BS_PUSHLIKE + BS_MULTILINE @ .. DCRADIO n VALUE 2 PROMPT 'Selection;2' OPTIONS BS_PUSHLIKE + BS_MULTILINE See the example in XDEMO.EXE - Sample Group 6 808. Added new OPTIONS clause to the @..DCCHECKBOX command. This provides checkbox visual options such as "Push-Like". Example: @ .. DCCHECKBOX PROMPT 'Check Me;First' ; OPTIONS BS_PUSHLIKE + BS_MULTILINE See the example in XDEMO.EXE - Sample Group 6 807. Added new ALIGNCAPTION clause to the @..DCPUSHBUTTON and DCADDBUTTON commands. This provides alignment of button captions left, right, top, bottom, center, vcenter and multiline. Example: @ .. DCPUSHBUTTON CAPTION 'This is;a Test' ; ALIGNCAPTION BS_MULTILINE + BS_LEFT See the example in XDEMO.EXE - Sample Group 6 806. Added new function: DC_GetValidateDebugBlock(). This is a Get-Set function to aid in debugging VALID statements, particularly to debug how the environment may have changed after a validation and thus may cause errors later in the program. 805. Added a replacement for the VALID clause: NOEXITVALID. This is used when the VALID block is to be evaluated only during regular editing but not during EXITVALIDATE. - Thanks to Jack Djuif 804. Added NOTABSTOP clause to DCGETOPTIONS. 803. Improved DC_QueryBuild() to allow for improved integration with an existing application. See example in samples\query. 802. Added new command: DCHTMLVIEWER. This is used to create a WebBrowser control that uses Internet Explorer. Works only with Xbase++ 1.9. See the example in SAMPLES\ACTIVEX\WEBBROW.PRG. 801. Improved the RGB mode of DC_PopColor() to allow color choice by either clicking on the color bars or the spinbuttons. 800. Added new ENDSPIN, DOWNSPIN and UPSPIN clauses to the DCSPINBUTTON command. 799. DC_SetScopeArray() now accepts an optional multi-dimensional array as the record array. The first element must be a numeric record number. 798. Fixed a bug in DC_DataSave() that sometimes stored the wrong table name when using the function to pass workarea info to another thread. 797. DCSUBMENU now accepts a code block as the caption. The caption will be updated every time the menu is invoked. 796. Added new Function: DC_Drive2UNC(). Thanks to Dian Ray. This function returns the UNC from a mapped drive letter. 795. Added new command: DCACTIVEXCONTROL. This is used to embed an ActiveX Control onto another object. See samples\activex\acrobat.prg. Note: This command is functional only under Xbase++ 1.9 or later. 794. Added new feature to DCBDEBUG. Double-clicking on the stack column will now invoke the default editor to edit the code at the the proc and line number of the stack. 793. Fixed a bug in DC_Num2Bin() and DC_BitTest(). A number of 255 was not converted correctly. 792. Added new Get-Set function: DC_SetDateRange(). This is used to establish a valid date range for all date GETs. 791. Fixed problem with DC_TestBof() causing Eof() to report an incorrect result under some conditions. 790. DC_GetListValidate() now accepts new parameters. Thanks to Jack Duijf. 789. Added new parameter to DC_PopFile() for choosing multiple files. - Thanks to Bobby Drakos. 788. DC_AutoRestoreWindow() now restores the frame state of the window. 787. Added new function: DC_BrowCellEditLastKey(). ---------------- New to 1.8 (build 236) ----------- 786. Added a new ICON clause to DCMSGBOX command and an parameter to DC_MsgBox(). 785. Fixed a bug in Cell-Editing that can eventually cause a stack overflow fatal error after a long period of cell-editing. 784. Added new Get-Set Function: DC_ScopeAds(). This is used to enable or disable the ADSDBE scoping system. 783. Added new SCALEFONT clause to the DCPRINT ON command. 782. Fixed a bug related to the EVAL clause of DCGETOPTIONS and DC_GetOptDefault(). The EVAL clause will now be applied to all windows as the default EVAL clause. ** CAUTION ** This may cause some applications to break if you are currently using the EVAL clause of DCGETOPTIONS followed by DC_GetOptDefault(). I recommend using the EVAL clause of DCREAD GUI for your main screen. 781. The NODESCENDTOGGLE clause of @..DCBROWSE will now remove the arrow from the column headings that use the SORT clause. 780. Added new function: DC_SpawnURL(). This is used to spawn the program associated with a file name or URL. 779. Added new function: DC_SendMailToDefault(). This is used to send an email via the default email client on the current workstation. 778. DC_BrowPres() now accepts a 2nd parameter - GetOptions. This is the options array used by DCGETOPTIONS. This should be passed when using scaling. 777. DC_PrintPreviewAcrobatOpt() now accepts a 3 as the 8th element to cause Acrobat or any other registered .PDF viewer to be launched as the viewer. 776. New function: DC_FormatMemoToWidth(). This function accepts a character string, a width and a Presentation Space object. It returns a character string with Hard CRs. It is used to create a memo that fits perfectly within a specified area based on the font used. 775. Added a new DEFAULTRESIZE clause to the DCGETOPTIONS command. This clause accepts an array of two parameters: (1) A code block that returns an array of two values for repositioning. (2) A code block that returns an array of two values for resizing. See the DCGUI_RESIZE_* constants in DCDIALOG.CH. 774. Added Automatic Font Scaling to the new SCALE clause of DCGETOPTIONS. This eliminates the need to select a font that matches the scale setting. See the examples in samples\scale. ---------------- New to 1.8 (build 235) ----------- 773. Tested with Xbase++ 1.9 beta (build 316). The DC_PrintPreviewAcrobat() and DC_Help() functions now use the Xbase++ 1.9 XbpActiveXObject() class instead of JazzAge when the source is compiled with Xbase++ 1.9. 772. Added two new functions: DC_ComboGetSetBlock() is used to create a Get-Set code block for DCCOMBOBOX that allows for parallel arrays when using comboboxes. DC_ComboSelectedBlock() is used to create an Item-Selected code block that allows for parallel arrays when using comboboxes. 771. Date type GETS are now incremented with the + (plus) key and decremented with the - (minus) key. 770. Added new DC_Calendar() class in _DCCALEN.PRG. See the example in samples\calendar. 769. Added new ALIGNRIGHT clause to the DCSAY and DCSAY..GET commands. This causes the end of the SAY object to align with the column given rather than the start of the SAY object. See the Align Right sample in Sample Group 6 of XDEMO.EXE. 768. Added new DEFAULTFONT clause to the DCGETOPTIONS command. This is used to set the default font for all objects created by DC* commands. 767. Added new SCALEFACTOR clause to the DCGETOPTIONS command. This is used to multiply X and Y coordinates by a factor which provides for enlarging or decreasing screen size. See the examples in samples\scale. 766. Added LINEWIDTH clauses to the @ DCPRINT BOX and @ DCPRINT LINE commands. 765. Added COLOR clauses to the @ DCPRINT commands. 764. Added a new Resizing system that makes it possible to define the rules for resizing and repositioning screen objects when the parent dialog window is resized. A new RESIZE clause has been added to DC* commands. This clause accepts an array of two parameters: (1) A code block that returns an array of two values for repositioning. (2) A code block that returns an array of two values for resizing. A new RESIZE clause has been added to the DCGETOPTIONS command. This clause creates a resize callback to use DC_Resize() as the resizing function. A new DC_Resize() function is used in conjunction with the RESIZE clauses to perform the resizing and repositioning. See the example in samples\RESIZE 763. Tooltips are now handled in a single thread, rather than a separate thread for each window. Thanks to Jack Duijf. 762. DC_AutoRestoreBrowse() now restores the font and height of the headers and footers. 761. Added new clauses to DCBROWSECOL command: HFONT HHEIGHT (in pixels) FFONT FHEIGHT (in pixels) 760. Added new class for putting an eXpress++ application icon on the Taskbar. See the example in samples\calendar. 759. COLOR and FONT clauses of DCDIRTREE now are supported. ---------------- New to 1.8 (build 234) ----------- 758. Added two new functions: DC_BusyOn() and DC_BusyOff(). These are a replacement for DC_WaitOn()/DC_Impl() that allow for a busy dialog to be embedded within a window while performing a process in a thread. Build the PRINT.XPJ in samples\animgif. 757. Added new options for the @ .. DCBROWSE .. EDIT clause. EDIT may now be an optional 2-element array. The first element is the event which will start cell-editing. The second element is a code block to evaluate when a key is pressed in the browse. The value of the key pressed is passed to the code block. The code block must return a numeric value equivalent to the key to enter into the cell, or an array of numeric values to enter into the cell. If a proper value is returned then cell editing will start. Example: @ .. DCBROWSE .. ; EDIT { xbeBRW_ItemSelected, {|n|_KeyEdit(n)} } STATIC FUNCTION _KeyEdit( mp1 ) IF mp1 >= 65 .AND. mp1 <= 90 // A-Z RETURN mp1 ELSEIF mp1 >= 97 .AND. mp1 <= 122 // a-z RETURN Asc(Upper(Chr(mp1))) ELSEIF mp1 == xbeK_SH_DOWN RETURN 0 ENDIF RETURN nil 756. Fixed bug in DCPUSHBUTTON .. STATIC where a window that is partially covering the button could activate the button when clicked in the window. 755. Fixed bug in numeric Gets where occasionally the value typed in at the beginning of the get is concatenated with the existing value rather than replacing the existing value. 754. Dialog windows now use an improved technique for managing the mouse cursor in a busy state. The "wait" or "hourglass" cursor is now applied only to the parent dialog and the mouse is captured by the parent dialog. This reduces the risk of IDSC errors. 753. Added new "Script-Save" feature to dot-prompt window. Click on the DOT button to open a window for saving and restoring scripts. Now you can write a script in the dot-prompt window and save it for later retrieval and execution. 752. New function: DC_MoveParentWindow() is used to move the parent window with the mouse by clicking on a child object at any level. Example: oStatic:lbDown := {|a,b,c|DC_MoveParentWindow(a,b,c)} Clicking the left button on oStatic will allow movement of the entire window until the mouse is released. See example in samples\movewin. 751. Fixed several dot-prompt and DBU bugs: a. Print List caused an error when no browse/edit window open. b. Deleting record in browse window didn't refresh browse correctly. c. Record number not always refreshed when moving thru browse. d. Error when deleting record in browse. e. DELETE REST caused fatal shutdown. f. Summing fields from Utilities caused wrong fields to be summed. 750. Added ACE Wrappers for all AdsDD*() dictionary functions to _DCADS.PRG. 749. Added support for ADS SQL cursors to the eXpress++ browse and cell-editing system. Now eXpress++ can be used with ADS to create SQL queries and render them in a DCBROWSE. Also added new ADSFIELD clause to DCBROWSECOL. See examples in \exp18\samples\ADSSQL. New functions: DC_AdsSQLQuery() - A SQL Query builder DC_AdsSkipper() - A Skipper for ADS cursors DC_AdsGoPosition() - Used in GoPosition block DC_AdsPosition() - Used in Position block DC_AdsFieldBlock() - Creates Get-Set code block DC_AdsDDCreate() - Creates a new Dictionary New Dot-prompt command: SQL QUERY -> Invokes query builder. 748. Added new Get-Set function DC_GetComboImmediate(). The function changes the behavior of @..DCGET..COMBO. A .TRUE. setting will cause the GET to update every time a new item is selected in the dropdown browse. A .FALSE. setting will cause the GET to update only after double-clicking in the browse. 747. Added 8th element to aFields array that is passed to DC_FindBrowse(). This is the picture clause for each column. 746. New function: DC_PrinterPortToName() is used to return the name of a printer that is assigned to a specified port. 745. New function: DC_CompleteEvents() is used to process events in special situations. 744. Added new :writeXML() method to the DC_XmlNode() class. 743. The SORT clause of DCBROWSECOL now looks at the value returned by the code block. If the value is a logical .F., then the column header is not highlighted. Non-sortable columns in @..DCFINDBROWSE are also not highlighted anymore after displaying the "No Index/Sort on this Column" message. 742. Added a new :fitColumns() method to the DC_XbpBrowse() class. Calling this method will resize all columns to fit within the browse width. 741. Fixed a bug in DCTREEITEM .. HELPCODE. Help codes were not getting properly passed to the help system. 740. Fixed a bug in @ .. DCGET .. PASSWORD. The password option would not work correctly with the POPUP clause. 739. Added new function to DCHELP.DLL: DC_HelpIcons(). This is a Get-Set function that is used to add custom icons to the help system. 738. DCBROWSECOL .. DATATOOLTIP now supports SQLExpress objects. 737. Fixed bug. The EXIT codeblock now works when using the DELETE feature of Browse cell-editing. 736. Fixed a bug that caused a runtime error when using DCGRA* commands in conjunction with the DISABLEDCOLOR clause of DCGETOPTIONS. 735. Fixed regression problem caused in build 232. HCOLOR clause of DCBROWSECOL was broken. 734. The captions of DCSUBMENU and DCMENUITEM may now be a code block that returns a character string. The menu prompt will be changed to the eval of the code block when DC_GetRefresh() or DC_GetWhen() is called. 733. Fixed regression problem in DC_GetValidate() when object is hidden or disabled. 732. Clicking on the CANCEL button now aborts @ .. DCGET .. RANGE checking. ---------------- New to 1.8 (build 233) ----------- 731. DC_AutoRestoreBrowse() now restores column fonts. 730. Improvements to DC_Dbu(): (1) Now creates a new window for each workarea unless the /reuse option is used. (2) Scrolling in edit window improved. Edit fields now resize properly when window is resized. 729. Added a new 3rd parameter to DC_TokenArray(). is a logical parameter (default is .F.). If is .TRUE. then delimiters that exist within quotes "" are ignored and quotes are stripped. Example: cString := '"Donnay, Inc.",'"eXpress++"' DC_TokenArray(cString,',',.f.) -> returns {""Donnay", " Inc."", ""eXpress++""} DC_TokenArray(cString,',',.t.) -> returns {"Donnay, Inc.", "eXpress++"} 728. @..DCTABPAGE now supports captions that are text, resources or images. Examples: @ .. DCTABPAGE .. CAPTION '\exp18\bitmaps\pencil.bmp' @ .. DCTABPAGE .. CAPTION 'Pencil' @ .. DCTABPAGE .. CAPTION BITMAP_PENCIL_S 727. Added new function: DC_SetScopeArray(). This is used to create a "roll-your-own" style of scope on a database. It is much better than filters or scopes when needing to browse a subset of a large database. An "array" of record numbers is used to establish the scope and all DC_Db*() functions will respect the scope including @..DCBROWSE. Example: USE TICKETS INDEX TICKETS OrdSetFocus('DATE') dbSeek(Date()) aRecords := {} DO WHILE TICKETS->date == Date() IF TICKETS->time = '10:00' .OR. TICKETS->time = '11:00' AAdd(aRecords,TICKETS->(RecNo()) ENDIF SKIP ENDDO DC_SetScopeArray(aRecords) DC_DbGoTop() @ .. DCBROWSE ALIAS 'TICKET' 726. Added new 8th option to DC_PrintPreviewAcrobatOpt(). The 8th element is used to determine the ActiveX control which will be used for previewing with Acrobat: Element Type Description ------- ---- ------------------------------------------ 8 N 1 - Use Acrobat control (default) 2 - Use Universal Web Browser Control Using the Universal Web Browser Control will eliminate a memory leak in the AcroRd32.exe process that is spawned from the ActiveX control, however the window closes slower. 725. Added new EXITAFTERPRINT clause to DCPRINT ON. This will close the preview window after the print from preview is selected. 724. Added new Get-Set function: DC_XbpGetPres(). This is used to set the default PRESENTATION parameters for the DC_XbpGet() class and all DCSAY..GETs and DCGETs. 723. The Tracker now supports SMTP authentication (when using Marshallsoft library). 722. DC_BitMapDraw() now supports .PNG files. 721. Added new parameters to DC_BrowseSort() to allow changing the color of browse headings that are "sortable" but "unselected" columns. Users can now see which column headers may be clicked on for resorting or reindexing. Example: LOCAL aSort := ; { GRA_CLR_WHITE, ; // Sort Selected Color (Foreground) GRA_CLR_RED, ; // Sort Selected Color (Background) GRA_CLR_WHITE, ; // Sort Nonselectable Color (Foreground) GRA_CLR_DARKGRAY, ; // Sort Nonselectable Color (Background) nil, ; // Sort UP Bitmap (no longer used) nil, ; // Sort DOWN Bitmap (no longer used) GRA_CLR_WHITE, ; // Sort Unselected Color (Foreground) GRA_CLR_BLUE } // Sort Unselected Color (Background) NOTE: The bitmaps are no longer used to determine sort ascending or descending. Instead, special Marlett characters are used. 720. Fixed bug in DC_GetValidate() and DC_GetListValidate() that allows validation of an object that is disabled or hidden. 719. Added new NORESTORE clause to the @..DCBROWSE command. This is used to override the setting of DC_AutoRestoreBrowse(). 718. Added new parameter to DC_PopFile(). 717. Added a new FILTER clause to the @..DCBROWSE command. This is used to set a filter for browsing arrays. Example: @ .. DCBROWSE .. FILTER {|a|'.DBF'$Upper(a[1])} 716. How to secure a web application: see the example in the \samples\stunnel directory. 715. How to display animated GIFs: see the example in the \samples\animgif directory. 714. Added new function: DC_RegDelete(). This is used to delete a key and it's values. 713. Added a new NORESTORE clause to DCREAD GUI and a lNoRestore parameter to DC_ReadGui(). This will override DC_AutoRestoreWindow() and insure that the window coordinates and size are never saved and restored. 712. DC_GetReadInsert() has been changed to accept either a logical value or a numeric value. Some users did not want mode changed. DC_GetReadInsert( xMode ) xMode Description ----- ------------------------------------------ .T. Set Insert Mode ON 2 Set Insert Mode ON .F. Set Insert Mode OFF (Overstrike ON) 1 Set Insert Mode OFF (overstrike ON) 0 Do not change Insert/Overstrike mode ---------------- New to 1.8 (build 232) ----------- 711. Added \exp18\upx directory which includes program for packing EXEs and DLLs. 710. Added two new functions: VScrollBarSize() and HScrollBarSize(). Returns an array defining the size of scrollbars selected by the user. 709. Added a new Get-Set function: DC_EnterExitMode() 0 - Standard Enter-Exit (exits if ENTER is pressed on last Get) 1 - ENTER pressed on last Get gives focus to OK button. 2 - Exits if ENTER is pressed any time. 708. A DCGET of type "Date" now supports the '@K' picture clause. 707. DC_APick() and DCAPICK now support a new parameter: cAutoSeekPicture and AUTOSEEKPICTURE. If a character string is passed then an autoseek window will be created above the picklist browse, using the passed picture. 706. DC_AutoRestoreWindow() now only saves the window if it is in a normalized state. 705. Fixed a bug caused by DC_GroupFix() that would not allow DCGROUP box objects to be overlayed using the HIDE clause. 704. Fixed a bug in DC_Dbu() that was causing a fatal program exit when selecting ADSDBE from the File menu. ---------------- New to 1.8 (build 231) ----------- 703. Fixed a few bugs in the HTML framework classes. 702. Fixed a visual regression caused by trying to implement fixes for the XP manifest anomoly in Xbase++. There is now a new solution for the problem of DCRADIO buttons on DCGROUP boxes not displaying correctly when using manifest files. See the new function DC_GroupBoxFix() and run the test program in \exp18\samples\xp. 701. Fixed a regression bug in DCHOTKEY. The PARENT clause now works again. 700. Added new Get/Set function: DC_GetReadInsert(). This is used to set the default insert mode when entering a new dialog. ---------------- New to 1.8 (build 230) ----------- 699. Updated DCDIALOG to add support for the CALCULATOR clause to @ .. DCSAY .. GET. 698. Fixed regression bug in XDEMO.EXE that was causing runtime error if XDEMO.CFG did not exist. Fixed visual problem in X_Sample_8(). 697. Added a new DC_XbpBrowse():restoreDefault() method. Call this method to restore browses to their default configuration when using the DC_AutoRestoreBrowse() feature. 696. Corrected a regression bug in DC_XbpBrowse():destroy() ---------------- New to 1.8 (build 229) ----------- 695. Added a new library: DCXML.DLL. This library contains functions, classes and methods for reading and parsing *.XML data in a way that is simple to use in Xbase++ applications. For a sample program see SAMPLES\XML. Requires the ASXML10.DLL from Alaska Software. New function: DC_Xml2ObjectTree() reads an XML file and creates an object tree. New class: DC_XmlNode() contains a set of methods for easily extracting the data from the object tree. 694. Added example of how to build an SQL browse in SAMPLES\SQL. 693. Added support for MarshallSoft EMAIL to the Tracker. See the example in SAMPLES\TRACKER. 692. Added support for Multiline Rows in DCBROWSEs. Run the sample MULTIROW.PRG program in SAMPLES\BROWSE for more information. 691. Added DC_XBrowse() sample in samples\xbrowse directory. 690. Added documentation to EXPRESS.HLP for the new functions added in build 228. 689. Fixed several bugs in DC_AutoRestoreBrowse() and DC_AutoRestoreWindow(). 688. Fixed regression bug in DC_PopDir() that was causing drive selection box to not function. ---------------- New to 1.8 (build 228) ----------- 687. Added improvements to DCBDEBUG debugger window. 686. Added support for XP Manifest files. Allows for XP manifest files to be included in a .RES file or as a separate file to provide your application XP-style buttons with no recoding or recompiling. 685. Added a new framework class: DC_XBrowse(). This is a class that allows for easy creation of data-driven browse/edit windows for databases. Windows can be related to other windows either in the same thread or in other threads. Full of handy user-configurable features for building browse/edit screens and saving configurations to an .INI file or registry. Example: USE customer oBrowse := DC_XBrowse():new() oBrowse:read() 684. Added new function: DC_AutoRestoreBrowse(). This is a Get-Set function used to set the Registry directory for storing browse column sizes and order. Data is saved to registry when a browse is destroyed and restored from the registry when a browse is created. The browse unique ID is used as the value name. 683. Added new function: DC_AutoRestoreWindow(). This is a Get-Set function used to set the Registry directory for storing window sizes and coordinates. Data is saved to registry when a window is closed and restored from the registry when a window is created. The window title is used as the value name. 682. Added support for Turkish Language, thanks to Hakan NAL. 681. Added support for marker lines and dynamic colors to bar graph system. 680. Added a parameter to DC_PopFile(). 678. DC_PrintPreviewAcrobat() now uses the Internet Explorer OCX rather than the Acrobat OCX. This prevents a memory leak in ACRORD32.EXE when viewing PDF files over and over again. 677. @..DCBROWSE now supports SQLStatement and SQLDataSet objects created by SQLexpress. eXpress++ can now be used for SQL Server projects with the same ease of programming as for DBF projects. 676. Modified DC_ReadGuiEventLoop() to now handle calls to xbpHandleOcxEvents() from the Xbase++ OCX (ActiveX) system. This will insure that ActiveX controls function properly in an eXpress++ dialog. Must use the WAIT clause of DCREAD GUI when embedding OCXs in an eXpress++ dialog using the Xbase++ OCX system. See the ANIMGIF example: \exp18\samples\animgif. 675. Added two new button types to the DCREAD GUI BUTTONS clause: DCGUI_BUTTON_YES and DCGUI_BUTTON_NO. 674. Added new function: DC_ToolTipTimeout( ). This is a Get-Set function that is used to cause tooltip messages to timeout after a specified amount of mouse inactivity. The default is 5 seconds. This should fix the problem of tooltips bleeding through other windows. 673. Fixed bug. MODIFY STRUCTURE would cause dialog to constantly stay in append mode when the STATUS BAR of the dot prompt was enabled. 672. Added new HYPERLINK clause to @ .. DCSAY and @ .. DCSAY .. GET commands. This will underline the say text and perform an action when the say text is clicked with the mouse. Ex: @ 1,1 DCSAY 'http://www.donnay-software.com' ; COLOR GRA_CLR_BLUE ; SAYSIZE 0 ; HYPERLINK ; {|p,c|p := 'url.dll,FileProtocolHandler ' + ; 'http://www.donnay-software.com', ; c := 'Rundll32.exe', ; RunShell(p,c,.t.,.t.)} 671. Added new function: DC_PrinterName(). This is a Get-Set function used to store the last printer name selected by the user from the printer dialog. 670. Fixed bug in DCGETOPTIONS .. BUTTONS clause. The buttons would not be created if there was no ADDBUTTONS or BUTTONS clause in DCREAD GUI. 669. Fixed bug in DC_StruUpdate() and MODIFY STRUCTURE (XDOT.EXE). If you modified the structure of a file, and change a field name to something else, the resulting action brings back any DELETED records as UNDELETED. 668. Added a 7th parameter to DC_PrintPreviewAcrobatOpt(). This parameter is used to Get/Set the default PDF printer driver. 667. Added a new CALCULATOR clause to the @..DCSAY..GET and @..DCGET commands. This causes inputting into a numeric GET to function exactly like the CalcSle() example of Xbase++. The CalcSLE class displays calculator-type entry fields for numeric values. The display of entered data is right aligned, the number of decimal places is unknown and the largest number to be entered is limited by the width of the entry field. 666. Added 1 new class and 2 new functions: oRecord := DC_dbRecord():new() - Create a database record object. DC_dbScatter( oRecord ) - Scatter fields into iVars. DC_dbGather( oRecord ) - Write iVars to database fields. 665. Added new function: DC_AddButtonConfig(). This function is used to configure the captions and sizes of buttons which are automatically created by the ADDBUTTONS or BUTTONS clauses of DCREAD GUI. 664. Corrected a bug in DC_PrintBrowse(). Fonts were not being printed correctly. 663. Added a second parameter to DC_TabActivate(). If this is a logical .TRUE. then a call to DC_CompleteEvents() will be made after activating the Tab. 662. Fixed a bug in DCSETPARENT. Object coordinates would be incorrect after using a DCSETPARENT command followed by a command that includes a PARENT clause, then followed by a command with no PARENT clause. 661. Added two new functions: DC_Var2HexString() and DC_HexString2Var(). Used to convert binary strings to hex equivalent for storing in .TXT files or in memo fields that do not accept binary data. 660. Corrected long-standing bug. MDI child windows using the AUTORESIZE feature would be corrupted if they were minimized and then the parent window was minimized. 659. Fixed a few more regression bugs created in build 226.