dBASE Plus release 2.61
New Features
New Bundled ODBC Drivers
dBASE Plus now ships with a bundle of branded Data-Direct ODBC drivers to make it simpler to connect to:
Oracle
SQL Server
Sybase ASE
DB2
Informix
FoxPro
Visual FoxPro
Clipper
Pervasive SQL (formerly Btrieve)
Streamlined client application deployment
The new bundled ODBC drivers for Oracle, SQL Server, Sybase ASE, DB2 and Informix not only handle the ODBC level processing, they also manage the sending and receiving of network packets between client workstations and database servers thus streamlining the configuration of client workstations by eliminating the need to install additional database communciations software on each client (as is required when using BDE SQL Link drivers).
Database Class
Added new property loginDBAlias, which allows a second database connection to be made to a database using the login credentials from an existing database connection.
Entryfield and SpinBox Classes
Added ability to use a percent sign (%) placeholder in the right-most position of the picture property (when datalinked to a numeric field), so that the percent sign can be displayed at the right end of numeric fields.
Exception Handling/Security
Enhanced execution time validity checks to prevent execution of invalid or corrupted instructions by the dBASE virtual machine interpreter.
Grid Class
Added new method firstRow( ) - returns bookmark for first visible row in the grid.
Added new method lastRow( ) - returns bookmark for last visible row in the grid.
Project Explorer
Added new "Ini" tab to the Inno section of the Project Explorer that allows a user to indicate whether or not a default ini file should be generated for a deployed application. If the user chooses to create the ini file, they can include a settings to use the BDE or not and to enable/disable the _app.ErrorTrapFilter flag.
Query Class
Added new property usePassThrough. The usePassThrough property is checked during query activation.
If true, the query's sql statement is passed through directly to the database server for execution. When opening very large tables this allows for very fast retrieval of the initial query result rows.
If false and a query's sql statement is a simple "select * from table" statement, dBASE Plus attempts to open the table using "table style" semantics. For tables up to a few million rows, this usually works well. For larger tables, this can result in a very time-consuming query operation.
Rowset Class
Added new property autoLockChildRows
When true (the default), child rows are automatically locked when a parent row is locked. This corresponds to previous behavior.
When false, child rows are not locked when a parent row is locked
Source Editor
When commenting (or uncommenting) multiple lines of code, the Source Editor will no longer comment (or uncomment) the last line if the cursor is in the first column.
Variant Support
Upgraded built-in COM and ActiveX support for variants so that most data types allowed in variants can be converted into dBASE variable or property values or into dBASE arrays (for COM SafeArrays).
dQuery (Developer's Edition v3.03)
Upgraded Database Connection Wizard to use new branded ODBC drivers and to simplify database connection process.
Most of the new dQuery branded ODBC drivers can communicate with your DBMS without having to install additional client side software.
Added ability to drag and drop large database tables to the design surface and to adjust dQuery's available options and behavior when using a large table
Implemented ability for dQuery to detect if a table is large or not. to optimize how it submits query.
Added ability to customize query before opening a table via a new "Write SQL before opening..." popup menu option. This option is available on the right click menu for the Databases and Tables Treeview and on the fly-out Select Table dialog.
Disabled ability to add, edit, or delete rows for a query if table has no indexes or if rowset is read only. Also changed background color of query object to make it appear pale blue instead of white when add or edit rows is not allowed.
Made Multi-Table View grid read only to prevent data entry errors when working with rows in parent/child relationships. User should use the Single Table View for any needed data entry.
Updates and Fixes
AgSum( )
Changed the report AgSum( ) function to return a variable of the same type as the field being summed instead of always returning a variable type of float. In reports, this caused the sum of an integer field to be displayed with decimal digits (.00) instead of as an integer. However, a float type value will still be returned by the AgSum( ) function if the sum of an integer field is outside the range of a long integer (-2,147,483,648 thru 2,147,483,647). This case can happen if the integer field contains very large positive or negative values, or a large number of rows are included in the sum.
ArgVector()
Fixed Memory Access Violation that occurred when ARGVECTOR( ) was called within a procedure to retrieve an argument whose name was declared PRIVATE prior to calling ARGVECTOR( ). This condition now triggers the following new error (Error code 403):
Error: Argument out of scope or hidden by a PRIVATE command: <varName>
Editor Class
Fixed firing of a field object's onChange( ) event when an Editor is datalinked to a memo field and a change is made via the Editor object and a rowset navigation is triggered.
EntryField Class
Modified Entryfield component to check if the framewindow is visible before opening a viewer for a datalinked blob field. If the framewindow is visible, then the viewer form will be opened as an mdi form (i.e. inside the framewindow). If the framewindow is not visible, the viewer form will now be opened as a non-mdi window (i.e. without any framewindow).
Fixed a problem when using the 'R' formatting code in the function property and a picture property template of '99999', in which a 1 in the leftmost position of the field would be lost when tabbing to next field. The resulting value would display as '00000'.
Fixed two problems that occurred when using the 'R' formatting code in the function property:
Fixed problem where digits entered in a numeric entryfield were lost because the actual characters displayed during data entry were not a valid numeric value. The entryfield was changed so that if the 'R' formatting code is specified and the picture property contains a valid template for a numeric value, then numeric data entry rules are enforced.
For example, with 'R' in the function property, and '999.99' in the picture property, entering the four characters, '9.12', from the left end of the entryfield would display as '9.1.2', which becomes 9.10 when it is converted to a numeric value (after pressing the enter key or tabbing to the next field). This happened because the entered decimal point did not automatically align with the placeholder decimal point from the picture property, so the second decimal point and all characters to the right of it were ignored when the string was converted to a numeric value.
Fixed the processing of numeric picture characters '9', '#', '*', '$' to only allow '-' or '+' to be entered at the left end of an Entryfield or Spinbox value.
Form Class
Fixed the form's nextObj property so it only returns objects in the tab order.
Form Designer
Fixed Source Alias substitution, which is used when code is streamed from the Form Designer (and other places), so the longest matching Source Alias path is used instead of a Source Alias to a higher level sub-path.
Fixed painting of line objects so the ends of the lines do not bleed-through to a new page when changing the current page for a form or notebook.
mousePointer Property
Fixed a problem that occurred when a non-default mouse pointer (also called the mouse cursor) was chosen for a form. Clicking any mouse button on the form surface (not on a component on the form) caused the mouse pointer to change to an arrow until the mouse was moved. This problem could also be seen when any of the mouse buttons was released (mouse up) after holding a button down, moving the mouse slightly to restore the selected pointer, and then releasing the button.
MSGBOX( )
Fixed a problem where a modal message box dialog would be assigned an incorrect parent window if its parent form is not the foreground application when MSGBOX( ) is executed.
onMouseOver / onMouseOut Events
Fixed onMouseOver and onMouseOut events so they do not fire for components on non-visible form pages.
Improved firing sequence of onMouseOver and onMouseOut events as follows:
Fixed firing sequence when the mouse was moved quickly from one grid to another and the two grids were close to each other. The onMouseOver event of the entered grid was fired before the onMouseOut event of the grid that was left.
When several crossing events occurred at once, their order is now as expected - First out of one component and then over another component, first over the form and then over the form child windows, first out of the child window and then out of the form.
The events are now fired at the outer border of a notebook.
A form component no longer fires the events, when the mouse crosses sibling form components that are inside it. For example, if there is a button within a rectangle, the rectangle over/out events are not fired when the button is crossed.
The events now fire for disabled and invisible components.
Printer Support
Fixed GPF that occurred when changing the printerName property of a printer, or after selecting a specific printer with a print dialog
Fixed lockup that occurred if printer.choosePrinter( ) was called more than once after changing printer.printerName.
Project Explorer
Fixed CURSOR::BEGINWAIT error that sometimes occurred when opening the Project Explorer.
Explorer.dll, which contains graphic files for the Project Explorer, has been renamed to ProjExp.dll to prevent it from being improperly labeled as spyware or a virus by some anti-spyware and anti-virus utilities.
Query Class
Corrected the query activation code so that if the query's canOpen( ) event returns False, query.active will be set to False instead of being left True.
QUIT Command
Fixed QUIT WITH <expN> so that <expN> (a return code) is correctly passed back to the operating system. When calling a dBASE Plus application .exe from another program or batch file, the return code can now be tested to determine if an error occurred or if some other action is required.
Report Designer
Corrected Group Pane of Report Designer so that clicking on an object in the Group Pane correctly selects the object in the Report Pane.
Corrected indentation of the group bands in the Group Pane of the Report Designer, so that when multiple group bands are present the outermost group has the smallest indent, the next group has a bigger indent and so on. Also, moved the text that labels the pageTemplate so it displays vertically along the left side instead of along the top.
Objects in the Group Pane of the Report Designer are now drawn with the same width as their corresponding object in the Report Pane.
Rowset Class
Fixed "Capability Not Supported" error that could occur when automatically unlocking a row after issuing a beginTrans( ). The BDE would return this error if beginTrans( ) has been called and a user does the following:
Edits a field in a row in a grid
Edits a second row
Goes back and edits the same field in the first row again
Then clicks on a different row
Fixed GPF that occurred when setting rowset.masterFields to a memo field when the child table’s current index is based on a character field. This will now generate a Type Mismatch error
Runtime Application
Fixed GPF that occurred when invoking a deployed application .exe using a UNC path.
SAVE … LIKE / LIKE( ) / LIKEC( )
Fixed regression that caused SAVE TO <mem file> ALL LIKE <memvar skeleton> to save variables that should have been excluded by the LIKE clause.
Also fixed related problems in the LIKE( ) and LIKEC( ) functions that could lead to these functions reporting incorrect matches between a supplied skeleton expression and a test string.
Source Editor
Fixed "dQuery.wfo does not exist" error that occurred when using the Fix option from a previous error dialog. With dQuery loaded, when certain errors occurred the following would trigger a secondary error:
Pressing Fix to open the Source Editor
Correcting the error
Closing the Source Editor
SpinBox Class
Fixed regression that caused the the spinbox to initially increment a value when its down arrow is clicked.
Fixed a problem when using the 'R' formatting code in the function property and a picture property template of '99999', in which a 1 in the leftmost position of the field would be lost when tabbing to next field. The resulting value would display as '00000'.
Fixed two problems that occurred when using the 'R' formatting code in the function property:
Fixed problem where digits entered in a numeric entryfield were lost because the actual characters displayed during data entry were not a valid numeric value. The entryfield was changed so that if the 'R' formatting code is specified and the picture property contains a valid template for a numeric value, then numeric data entry rules are enforced.
For example, with 'R' in the function property, and '999.99' in the picture property, entering the four characters, '9.12', from the left end of the entryfield would display as '9.1.2', which becomes 9.10 when it is converted to a numeric value (after pressing the enter key or tabbing to the next field). This happened because the entered decimal point did not automatically align with the placeholder decimal point from the picture property, so the second decimal point and all characters to the right of it were ignored when the string was converted to a numeric value.
Fixed the processing of numeric picture characters '9', '#', '*', '$' to only allow '-' or '+' to be entered at the left end of an entryfield or spinbox value.
StreamSource Class
Fixed problem with streamSource's rowset property. Setting it to a different rowset now, correctly, turns off notifications from the previous rowset to the streamsource object.
Subform Class
Fixed the excessively slow grid scrolling (on a subform) and the frame title bar blinking that was related to it.
Table View - Context Menu
Fixed problem that caused the wrong context menu to display when running dBASE Plus with a manifest file, opening a table from the Tables tab of the Navigator, and right-clicking on the Table View window.
TreeView
Fixed regression to treeview's borderStyle property so that changing it from its default value no longer causes flickering. Also fixed lockup that occurred when changing it via the Inspector in the Form Designer. This problem was caused by the fix for QAID: 5287.
Fixed Memory Access Violation that sometimes occurred when a treeView's releaseAllChildren ( ) method was called, and a tree item was selected.
XP Theme Support
Fixed copy( ), cut( ), and paste( ) methods when called from an XP themed pushButton. Previously, these methods failed to work when using an XP theme.
Fixed the following XP theme issues:
EntryField, SpinBox, Editor, ListBox and Rectangle now support XP styles, when XP theme is active and with default properties.
Fixed position of text for a rectangle object when XP themes are used.
When the mouse enters an XP style push button (turning it orange), XP sends a paint message to the form text component. The painting of non-transparent text was done directly to the screen and caused flickering. The text painting code is now changed to do most painting operations off screen.
Disabled combobox (simple or dropDown styles) with XP style had black background behind the list items. The background brush and text background of a disabled combobox are now white.
Fixed systemTheme speedBar pushButton so that clicking it with the mouse does not take focus from control that currently has focus. This occurred with editor and entryField components among others..
Fixed problem in the Form Designer, when pasting a shape or line component onto an XP themed notebook, the pasted shape or line were invisible.
Corrected text and group box background colors to match containing window for various core product dialogs when XP Themes are enabled.
Fixed a regression in the Form Designer Properties dialog that caused the OK, Cancel, Help and Apply buttons to be positioned incorrectly when XP Themes were not enabled.
Fixed regression that caused rectangle components to ignore mouse events and not fire their mouse event handlers that was due to changes to support XP Themes.
Corrected overlapping of some controls in Project Explorer when using XP Themes.
dQuery
Create Table
Added new form for selecting database and table name for "create table".
Database Connection Wizard
Fixed the Delete Database Connection option in the dQuery Database Connection Wizard so that it can delete connections made using an ODBC System DSN as well as ODBC User DSN's.
Datamodule Code Generation
The order in which database objects are written to the datamodule file has been changed to match the order in which the database's where added to the datamodule at design time.
Export Wizard
Corrected spelling of "Unable" in Export Wizard.
Fixed "Value out of range" error that occurred when exporting a Sybase ASE table to a comma separated text file (.csv).
Updated dQuery Export Wizard to disable the Multi-Table View option if the Multi-Table View has not been setup yet.
Updated Export Wizard so it no longer allows user to click Next to move to the Destination Table page after user cancels from destination database login dialog.
Fixed "Data Type Mismatch Error. Expecting: Logical" that occurred when attempting to export a table in a DBMS database to a new table in the same database.
Modified dQuery's Export Wizard so it disables the Current Query option if no query is available to export from.
Updated export wizard to correctly export data from temporary tables (PASS THROUGH SQL tables) generated by executing queries via .sql files. Also added tests to prevent exporting a field from a PASS THROUGH SQL table as part of the Multi-Table View as this is not currently supported.
Import Wizard
Fixed "Database Not Opened" error that occurred in the Import Wizard when canceling out of the database login dialog when choosing a table to import.
Miscellaneous
Fixed a "variable undefined" error when deleting a session object from the design surface that the user had added.
Fixed table or view not found error that occurred when opening a SQL Server table with spaces in the name.
Fixed Memory Access Violation that occurred after attempting to use the Rows | Replace Field Values menu option when the currently selected query is a table that cannot be edited due to it being opened via ODBC and not having any indexes.
Removed the extra back-slash in the default dQuerySamples alias path created by dQuery when the alias doesn't already exist.
Fixed "Index Does Not Exist" error when clearing index for a Non-Indexed Parent/Child Link when using a MySQL database.
Removed "Include all rows" option from Standard Filter and Non-Indexed Search dialogs.
Fixed "Database Engine Error: Index does not exist" that occurred when closing the Table Designer after opening some DBMS tables that have no indexes.
Added code to prevent user from closing dQuery form while dQuery is in the middle of running processes that require controlled exits. Processes modified are: Load current report, Calculate sum, Calculate count, Calculate minimum, Calculate maximum, Calculate average, Open fly-out tables list.
Fixed "Value out of Range" error and other potential errors that could occur when dragging splitter bar past bottom of dQuery form window and when maximizing dQuery form within its frame window. Added code to prevent dQuery from using splitter position values that are too large or too small from .ini file.
Removed access to right-click popup menus for editor controls in the following dQuery Business User dialogs: Filter Properties, Field Detail, Table and Query Properties, Rowset Properties.
Fixed "Variable Undefined: QLANG" error when canceling a search run via the Search | Non-Indexed Search menu option.
Fixed the Set Order dialog, which has the wrong name for the second tab when there is no current index or no index is selected.
Fixed "Database Engine Error: Table does not exist: t" when using Filter | SQL Select Filter dialog. Corrected use of table alias "t" in the generated SQL Select statement when reserved words are used for fieldnames in a field list.
Fixed incorrect font size problem that sometimes occurred in the Multi-Table View grid's rightmost column where the font size of this column would become larger than in the other columns.
Disabled the Filter | SQL Select menu option for inactive queries.
Prevent error that occurred when right-clicking on dQuery design surface, choosing "Add Table" and then canceling out of the database login dialog.
Modified the dQuery Tables menu to enable the "Encrypt table" option only for dBASE or Paradox tables.
Corrected the Fly-out Table list window's resize routine so that it correctly positions and sizes all of the window's components.
Disabled menu and toolbar options to Add Row and Goto Last Row for large DBMS tables.
Fixed regression in Filters | SQL Select... dialog that prevented the full list of fields from showing when modifying a query that retrieved a subset of fields from a table.
Fixed "Invalid Object Name" error that occurred after using the Table Wizard's Modify Table Structure option to view the structure of DBMS tables from SQL Server or Oracle.
Fixed Filter | Clear All Filters and Filter | Clear Any SQL Filter menu options so that they also clear a "T" alias definition if it is present in the filter SQL statement. This can occur in SQL statements created by the Star Filter.
Updated dQuery wizards to prevent them from responding to multiple clicks, by the user, of the Finish button. Now only responds if Finish has not already been clicked.
Fixed error that occurred if user cancels out of database login dialog when selecting a source or destination table in:
Table | Create Table From, Table | Copy Table To, Table | Copy Structure To
Improved ability of Hand-Edit SQL dialog to preserve Parent/Child links including non-indexed Parent/Child links.
Updated dQuery's Database Connection Wizard's DB2 option to default to supporting the IBM Client Access ODBC driver for DB2 on the AS/400.
Prevented display of incorrect child row data when using dBASE tables in a non-indexed parent/child relationship and a parent row has no matching child rows.
Fixed a GPF caused by clearing rowset.masterFields in the Inspector for a child rowset.
Fixed "Index does not exist" error that occurred when loading an existing datamodule into dQuery for DB2 and some versions of Oracle when an explicit index was set within the datamodule.
Fixed "Database Engine Error" that occurred when opening some DB2 for Windows system tables including: SYSCAT.TABLES, SYSCAT.INDEXES, SYSCAT.EVENTS.
Fixed Memory Access Violation that occurred when switching dQuery's report view from the Automatic Report to a saved report when the datamodule contains a Standard (CanGetRow) filter on the rowset.
Multi-Table View
Mouse pointer now changes to an hour glass when dropping a field onto the Multi-Table view and changes back once the view has been updated.
Fixed a problem where Multi-Table View column width changes are lost the first time a datamodule is saved.
One-Click Windows Application
Fixed "Data type mismatch: Expecting Object" error that occurred when selecting the Multi-Table View tab on a dQuery deployed Windows application when no Multi-Table View was defined before the application was created by dQuery.
Disabled the Index Order and Speed Search comboboxes on a dQuery deployed Window's application when there are no indexes defined. Changed the background color of the comboboxes from yellow to white.
Corrected typo on the first page of the dQuery deployed application Filter Wizard, changed "expressiont" to "expression".
Parent/Child Wizard
Fixed "Index does not exist" error after using Parent/Child Wizard to setup a non-indexed link, choosing to enforce one-to-one relationship, and then clicking on each query object on design surface.
Reports
Upgraded report totals so that they will not include a decimal point and additional digits to the right of the decimal point unless absolutely necessary.
Set Order Dialog
Fixed "Index does not exist" error when setting index order to natural order.
SQL Expression Generation
Corrected SQL expression generated for the "None of the conditions" option in the dQuery expression builder, which is used in the SQL Select filter, the Filter Wizard and elsewhere. Previously, the logic generated was NOT "All of the conditions" instead of the logic for "None of the conditions", which is different.
Star Filter
Fixed Server Error with the Star Filter's "Apply to Datamodule" option when the query's requestLive property is set to false. Also fixed problems with recovery of the datamodule rowset state after this error occurred. Fixed the right-click Requery option to handle the case where query.requestLive=false and there is a "T" alias in the SQL statement from a Star Filter generated WHERE clause.
Web Wizards
Fixed "In use by another: ...\dBLCore\temp\Wiztemp1" error dialog that could occur when choosing Applications | Web Wizards a second time in dQuery standalone.
Fixed "Unknown database name: dQueryTemp" error that occurred when selecting Applications | Web Wizards a second time.
XP Theme Support
The current Windows XP Theme is now used by form components in dQuery dialogs and One-Click Window applications including: EntryFields, SpinBoxes, Editors, ListBoxes and Rectangles.