Superbase NG v2.10 — Release Notes
CONGRATULATIONS on acquiring the latest Superbase NG product (previously called SIMPOL Professional). This product is the result of years of design and development together with in-house testing and use. In spite of that, no product is perfect, so we look forward to hearing from our customers with suggestions for improvements, and should a bug crop up, about those too. There is a large amount of documentation and example code provided with the product. Please make sure to look through the projects provided, most are well commented and can demonstrate various approaches to using Superbase NG and the SIMPOL programming language. With the release of Superbase NG v2.0, we have archived the old release notes. If you wish to check anything that was previously in them, you will find them here. There are six handbooks so to get started quickly, it may be useful to read the first chapter of the IDE Tutorial, Chapter 2 in the Programmer’s Guide, and Chapter 3 of the Quick Start Guide, preferably in that order. At that point, the text in Chapter 3 of the Quick Start Guide will suggest various ways forward.
IMPORTANT!
To get access to the updated releases you will need to register on-line at our web site and then register your copy of the product. We will then make the downloads available to you.
As a result of the changes to wxformgrid
, the 2.10 release is not binary compatible to the old dataform1
series of types and therefore not compatible to any project that uses those types. It will be necessary to recompile any project with the updated libraries before attempting to run it.
Start Here
- Click on Windows Start / All Programs
- Find the folder marked: Superbase NG
- Click on this and the following will pop out:
- Register Online on the Web
- Release Notes (this document)
- SIMPOL Language Reference
- Superbase Classic Conversion Tools
- Superbase NG IDE Quick Start Manual
- Superbase NG IDE Tutorial (the guide to your first SIMPOL program)
- Superbase NG IDE User’s Guide
- Superbase NG IDE
- Superbase NG Personal User’s Guide
- Superbase NG Personal (the program for creating items interactively)
- Superbase NG Programmer’s Guide
- Superbase NG Quick Start Guide
- Superbase NG Sample Projects
- Superbase NG Utilities
- Superbase NG Uninstall
Contents
- V2.10 Release-Specific Notes
- V2.06 Release-Specific Notes
- V2.05 Release-Specific Notes
- V2.02 Release-Specific Notes
- V2.01 Release-Specific Notes
- V2.0 Release-Specific Notes
- Included Files
Included Files
The distribution contains the following files:
releasenotes.html | This file |
Superbase NG Documentation in HTML Help format (docs\…
)
tutorial.chm | The IDE Tutorial Book |
ideref.chm | The IDE Reference |
personal.chm | The Superbase NG Personal User Guide |
progbook.chm | The SIMPOL Programmer’s Guide |
langref.chm | The SIMPOL Language Reference |
quickstart.chm | The SIMPOL Quick Start Guide |
SIMPOL Language Execution and Components (bin\…
)
ICONV.DLL | The iconv library from the GNU project — used by the XML DOM Component. |
LIBXML2.DLL | The libxml2 library from the Apache project — used by the XML DOM Component. |
LIBXSLT.DLL | The libxslt library from the Apache project — used by the XML DOM Component. |
ZLIB1.DLL | The zlib1 library was written by Jean-loup Gailly (compression) and Mark Adler (decompression) — see www.zlib.net for more information. This is used by the libxml2 library and is therefore included here. Used by the XML DOM Component. |
FCGD1_32.EXE | The debug Fast-CGI wrapper for use in web servers such as Apache, allowing SIMPOL programs to work as high-performance web applications (not for distribution, development use only). |
serverclose.exe | The program that is called to close the simpolserver.exe multi-user server program |
simpolpersonal.exe | The SIMPOL Personal program for creating and modifying databases, forms, printable forms, and reports |
simpolserver.exe | The SIMPOL database multi-user server program |
simpolserverclient.exe | The client program for controlling the SIMPOL database multi-user server program |
SBSORT32.DLL | The Win32 sort order support library (can be also used with the 32-bit ODBC driver). |
SIMPOL.SMP | The compiler (this is a compiled SIMPOL program — not for distribution). |
SMCGI32.DLL | The CGI support library used by SIMPOL when called from SMPCGI32.EXE . |
SMPCGI32.EXE | The CGI wrapper for use in web servers such as Apache, allowing SIMPOL programs to work as web applications. |
SMDBG32.DLL | The SIMPOL debug support library (not for distribution, development use only). |
SMEXEC32.DLL | This allows the calling of SIMPOL functions from compiled SIMPOL libraries as DLL calls for Win32. |
SMFCGI32.EXE | The Fast-CGI wrapper for use in web servers such as Apache, allowing SIMPOL programs to work as high-performance web applications. |
SMGD1_32.EXE | The CGI debug wrapper for use in web servers (not for distribution, development use only). |
SMISAP32.DLL | ISAPI support for Win32 (allows using SIMPOL programs with IIS as ISAPI web applications). |
SMLXML32.DLL | The SIMPOL LXML libxml2 Component used by the XML Document Object Model library. |
SMODBC32.DLL | The SIMPOL ODBC Client Component, which provides access to ODBC data sources for Win32. |
SMPCGI32.EXE | The CGI wrapper for use in Web servers (see below for details). |
SMPD1_32.EXE | The SIMPOL debug runtime loader (not for distribution, development use only). |
SMPRUN32.EXE | The SIMPOL runtime loader for command line programs. |
SMPOL32.DLL | The SIMPOL library for Win32 (core language). |
SMPPCS32.DLL | The SIMPOL PPCS support library for Win32 (multi-user database client). |
SMPPSR32.DLL | The SIMPOL PPSR support library for Win32 (multi-user database server). |
SMSBME32.DLL | The Superbase Micro Engine Database SBME component library for Win32. |
SMSLIB32.DLL | The SIMPOL Shared Library SLIB Component library for Win32 (allows SIMPOL language programs to call external DLL functions). |
SMSOCK32.DLL | The SIMPOL SOCK TCP/IP sockets component library for Win32, providing multi-threaded client and server functionality. |
SMSYM32.DLL | A SIMPOL debug support library (not for distribution, development use only). |
SMUTOS32.DLL | The SIMPOL UTOS Operating System Utilities component library for Win32 (provides file and directory support). |
SMPW1_32.EXE | The SIMPOL debug runtime loader for GUI programs. |
SMPWIN32.EXE | The SIMPOL runtime loader for GUI programs. |
SMWXWN32.DLL | The SIMPOL wxWidgets support library for Win32. |
svcrunnr.exe | The SIMPOL script service program for running the simpolserver.exe as a service |
SIMPOL wxWidgets Components (bin\…
)
wxbase28u_vc_simpol.dll | This contains the base wxWidgets support and is required when using the WXWN component. |
wxmsw28u_core_vc_simpol.dll | This contains the core GUI components for wxWidgets and is required when using the WXWN component. |
wxmsw28u_adv_vc_simpol.dll | This is used by advanced GUI components, such as the wxGrid control. It is not currently required or used. |
SIMPOL IDE Components (bin\…
)
SBNGIDE.EXE | The SIMPOL IDE for Win32 for Ansi |
SBNGIDE.EXE | The SIMPOL Unicode IDE for Win32 (will only install to Windows NT, 2000, XP, Vista, etc.). Only one editor installs, if the Unicode editor can be installed, then it will be selected over the Ansi editor. |
SBNGIDEARA.DLL | Arabic language support library for the IDE (not 100% translated yet). |
SBNGIDECHS.DLL | Chinese Simplified language support library for the IDE (not translated yet). |
SBNGIDECHT.DLL | Chinese Traditional language support library for the IDE (not translated yet). |
SBNGIDEDEU.DLL | German language support library for the IDE (not 100% translated yet). |
SBNGIDEELL.DLL | Greek language support library for the IDE (not 100% translated yet). |
SBNGIDEENU.DLL | English language support library for the IDE. |
SBNGIDEESP.DLL | Spanish language support library for the IDE (not 100% translated yet). |
SBNGIDEFRA.DLL | French language support library for the IDE (first French version released with 1.7!). |
SBNGIDEITA.DLL | Italian language support library for the IDE (not 100% translated yet). |
SBNGIDEJPN.DLL | Japanese language support library for the IDE (not translated yet). |
SBNGIDENLG.DLL | Dutch language support library for the IDE (not translated yet). |
SBNGIDEPTG.DLL | Portuguese language support library for the IDE (not translated yet). |
SBNGIDERUS.DLL | Russian language support library for the IDE (not translated yet). |
SBNGIDESVE.DLL | Swedish language support library for the IDE (not translated yet). |
SBCODE32.DLL | IDE support library. |
SBNGIDECALLER.EXE | Callback program for interactive web site debugging (NT, 2000, XP, Vista, etc. only). |
If you know of a language that you think we should support (or are prepared
to help localize one of the above that is not yet done, then let us know!
IDE Color-coding Support (bin\…
)
The following are the INI files that are used to color code the various
languages supported by the IDE.
C#.INI | C# |
DevStudio.INI | C, C++ |
EditBinary.INI | For the editing of binary files |
HTML.INI | HTML, SMZ (SIMPOL Server Pages) |
IDL.INI | IDL (Interface Description Language) |
JScript.INI | JavaScript |
ReadBinary.INI | For the viewing of binary files |
SIMPOL.INI | SIMPOL |
Superbase.INI | SBP programs, tokenized and ASCII |
TEXT.INI | Basic text files |
VB.INI | Visual Basic |
VBSCRIPT.INI | Visual Basic Script |
XML.INI | XML, XSL |
IDE Help Assistant Files (bin\…
)
simpol_odbc.api | ODBC Component — ODBC Client Database Access |
simpol_ppcs.api | PPCS Component — PPCS-Based Database Client Access |
simpol_ppsr.api | PPSR Component — PPCS Type 1 Database Server for SBME |
simpol_sbme.api | SBME Component — Superbase Micro Engine (Single-user) |
simpol_slib.api | SLIB Component — Shared library access (DLLs) |
simpol_sock.api | SOCK Component — TCP/IP Socket Client and Server support |
simpol_utos.api | UTOS Component — File System, Directories, Files |
simpol_wxwn.api | WXWN Component — wxWidgets-based Windows, Forms, Form Controls, Dialogs, … |
Runtime Files for the ANSI Editor
OE70AS.DLL |
VC6-RE200L.DLL |
OT80AS.DLL |
RWUXThemeS.dll |
SF20AS.DLL |
SYSTEM32\MSVCP60.DLL |
SYSTEM32\MFC42.DLL |
SYSTEM32\MFC42LOC.DLL |
SYSTEM32\MSVCRT.DLL |
SYSTEM32\MSFLXGRD.OCX |
Runtime Files for the Unicode Editor
OE70ASU.DLL |
VC6-RE200L.DLL |
OT80ASU.DLL |
RWUXThemeSU.dll |
SF20ASU.DLL |
SYSTEM32\MSVCP60.DLL |
SYSTEM32\MFC42U.DLL |
SYSTEM32\MFC42LOC.DLL |
SYSTEM32\MSVCRT.DLL |
SYSTEM32\MSFLXGRD.OCX |
Runtime Files for Linux (linux\…
)
libsbcode.so | Utility library used by SIMPOL. |
libsbsort01.so | Sort library used by various SIMPOL database library components. |
libsmdbg.so | Debugging library used by the debug versions of the runtime programs. |
libsmpol.so | SIMPOL main language library. |
libsmpolcgi.so | SIMPOL CGI library used by the smpcgi program for running web applications. |
libsmpollxml.so | SIMPOL XML library used by the SIMPOL DOM support library. |
libsmpolppcs.so | SIMPOL PPCS library for client database access using PPCS type 1. |
libsmpolsbme.so | SIMPOL SBME database library for single user database access to the new database engine. |
libsmpolsock.so | SIMPOL SOCK library that provides TCP/IP client and server sockets support. |
libsmpolutos.so | SIMPOL UTOS file system utilities (directory and directoryentry objects). |
libsmpolwxwn.so | SIMPOL WXWN GUI components. Requires wxWidgets 2.8.x to be installed on the distribution. |
smfcgi | SIMPOL Fast-CGI program launcher. |
smfd1_ | SIMPOL Fast-CGI program launcher with debugging information for handling errors that cause a program to halt. |
smprun | SIMPOL program launcher. |
smpd1_ | SIMPOL program launcher with debugging information for handling errors that cause a program to halt. |
smpcgi | SIMPOL CGI program launcher. |
smpd1_ | SIMPOL CGI program launcher with debugging information for handling errors that cause a program to halt. |
The Linux files will eventually be placed in a Linux installer but for now we haven’t done so. The lib files should all be placed somewhere like /usr/lib
or /usr/local/lib
. The program launchers: smprun
, smpcgi
, smpd1_
, and smgd1_
should be placed in /usr/bin
or /usr/local/bin
. They also need to be marked as executable (chmod a+x
).
The Rest
The remainder should be self-evident. We haven’t listed the include files, library files, samples, or projects, since this has gradually become so much that it would take far too much effort to maintain in multiple places. For details see the Superbase NG Quick Start Guide.
Superbase NG v2.10 Specific Notes
This release contains repairs for several code defects, a large number of updates to existent libraries, and an altogether new library for interacting with ODBC data sources using the quickreport1
and report1
types. It also contains a new system function !ostype()
plus some updates to wxformgrid
and a new form control: wxformgauge
.
As a result of the changes to wxformgrid
, this release is not binary compatible to the old dataform1
series of types and therefore not compatible to any project that uses those types. It will be necessary to recompile any project with the updated libraries before attempting to run it.
New in Superbase NG 2.10
As mentioned earlier, a new library has been added. It’s capabilities will be expanded upon over time.
smpol32.dll
– A new system function,!ostype()
, was added to ensure that the operating system and the operating system architecture can be properly assessed.smwxwn32.dll
– Thewxformgrid
was modified by removing the non-functionalonmouse
event and adding the following events:oncellleftclick
,oncellleftdblclick
,oncellrightclick
,oncellrightdblclick
,onlabelleftdblclick
,onlabelrightclick
, andonlabelrightdblclick
. In addition to the changes towxformgrid
, the new form type:wxformgauge
has been added. It has also been used to update the existinggaugelib.sml
so that they now use thewxformgauge
by default. This control provides the operating system default gauge control for use in your own projects.odbcsql1.sml
– This is a new library that is designed to provide asqlq1
wrapper around an ODBC connection in order to use the SIMPOL report library and wrapper libraries to provide access to their functionality for ODBC data sources. Currently this support only coversreport1
andquickreport1
types, and does not yet support the user interface for Quick Reports.
Changes to Libraries in Superbase NG 2.10
We did preparation work in some functions in formlib
and graphicreportlib
for an eventual change allowing a messages array to be passed around containing the correct (potentially translated) messages to be used in functions that display text to the user. This is a first step towards allowing the localization of Superbase NG libraries and programs such as Superbase NG Personal.
The necessary code, modified from code in Superbase NG Personal, was added to allow the dataform1
, printform1
, labeldef1
, and graphicreport1
objects to resolve missing tables (moved or misspelt), supporting both sbme1
and ppcstype1
, as well as missing field names. In the process, the MakeNotNull()
function was moved from formlib.sma
to stringlib.sma
and the sprintf()
function was added to stringlib.sma
, both of which are exported. This affected the binaries of most other projects. Changes were made as required to support the new features for opening forms, print forms, graphic reports, and label definitions.
appframework.sml
– Thegettableformatstrings()
function was updated to use the newergetnewfieldinfoarray()
instead of the oldgetfieldinfoarray()
version. A correction was done to theduplicaterecord()
function when in table view. The field selection code was modified to ensure that theField Selection
menu item is unchecked if there is any failure or user cancellation. Theappwindow.openformdirect()
function now accepts a new final parameter:type(db1record) r
, which allows it to pre-select that record before showing the form to the user, thereby reducing the flicker associated with selecting a record afterwards. Theselectrecord()
function was updated to ensure that it uses objects that have been instantiated.codepageslib.sml
– We added the DOS code page 850 to the library.commonreportgui.sml
– The missing implementation of the TRIM functionality was created for calls from the GUI for report filters and calculations.conflib.sml
– We fixed a problem that would occur if the ini file were empty, which would result in the file contents eventually being set to.nul
and nothing successfully being written back to the ini file.databaseforms.sml
- A problem was corrected where detail block entries were not being re-read when
dataform1.setmasterrecord()
was called. - Numerous changes were made to support not having a
mastertable
on a form. Previously the design enforced amastertable
, but there are situations where nomastertable
would exist, such as a form used as a dialog, but which in design mode also has a data table as the source for a combo or list box. Another case would be a form with an unlinked detail block and no other bound controls outside the detail block on the form. - We added a missing statement that should have set the object to
.nul
in the case of an error in the.new()
method for thedataform1datasource
type. - The
codepage
property was added to thedataform1datasource
type and everywhere in the functions where it was required for correctly supporting alternate code pages using PPCS. - We fixed a bug where under certain conditions, the code to redraw the scroll bar for a detail block region would try to dereference a null object.
- A range check was added for the
backgroundrgb
value fordataform1page.new()
. - Code was added to renumber pages when a call to dataform1page.remove() occurs plus a technique for showing a valid page afterwards.
- The code was modified to assign the new index to
dataform1.mastertable.currindex
if a call todataform1.selectkey()
passes in a new index. - We corrected a problem in
dataform1.selectkey()
andprintform1.selectkey()
where an index of typenumber
was not acceptinginteger
input as an alternative. Please note that indexes of type number are strongly discouraged and should be changed to either integer or string if at all possible. - We added support for the
wxformgauge
/dataform1gauge
control and also the new events for thewxformgrid
/dataform1grid
/dataform1datagrid
control. The parameter names for theprintform1bitmap.setposition()
method were corrected so that it also usesprintleft
,printtop
,printwidth
,printheight
, instead ofleft
,top
,width
, andheight
. This is consistent with the other functions. - A problem was corrected in the code that is called to save a form as source code. The expression required additional parentheses in order to be more precise and when they were not present that resulted in an error 21.
- A change was made to
printform1.new()
to ensure that everyprintform1.name
has a value assigned in the.new()
method. This was necessary because recent code updates were dependent on theprintform1.name
value not being empty. - Significant changes and improvements were made to the detail block implementation. There were various issues when removing a detail block that prevented it from being truly removed (still existent references to the detail block that needed to be cleared).
- A problem was corrected where detail block entries were not being re-read when
db1util.sml
- We fixed a problem that is caused by a conversion of a Superbase version 1.x file format into Superbase NG when the display format of a string contained an L as a prefix. It is highly recommended that all Superbase files be reorganized in at least a version 2.x Superbase program before they are imported into Superbase NG.
- We added the functions
FCASE()
andTCASE()
todb1util.sma
and changed thestring2val()
function to use them instead of thefcase()
and.tcase()
functions. This was done to ensure that the behavior of the functions are consistent with Superbase Classic. - Modifications were done to
getfieldinfoarray()
andgetnewfieldinfoarray()
to deal with theboolean
field type, which will contain adisplayformat
of1
andsharetype
ofLOG
(as astring
). In these functions it will now return a valid boolean format string. Also fixed thegetnewfieldinfoarray()
function so that it returns an array that is both numerically indexed as well as indexed by field name. Previously the field name index was lacking. - The
storerecord()
function was added to provide a generic function for saving records that is aware of the differences betweensbme1
andppcstype1
. - The function
create_sbme1table_from_db1table()
was improved so that it also produces the extended field information. This can be disabled by passing a new parameter to the function at the end.
Thedb1fieldinfo.new()
method was modified to ensure that each property has a valid value. - We added some code to Superbase NG Personal to try and prevent the pasting of one or more records when a blank or modified record is shown on the screen. It should now produce an error message that the record needs to be saved before pasting records.
dbconverter.sml
– Support for the extended field attributes for sbm files was added to the appropriate converters, including calculation, validation, read-only, required, default, etc.displayformats.sml
– The"."
display format was not being correctly handled.drilldown.sml
- We updated the
drilldown()
function with two new parameters:caseinsensitive
andstartvalue
. The first is obvious, it forces a case-insensitive comparison, the second allows the passing in of a starting value and if one is passed in, then it will cause a search upon opening the dialog based on the content of thestartvalue
, as long as the starting value exceeds the value passed forminactivationchars
. - The
drilldown()
andtablesearch()
functions were modified to use the new left double-click event of the grid to allow the user to double-click on the target row to select and close the dialog. - In the
drilldown()
function a change was introduced that allows the user to show data output as soon as the dialog is displayed. To do this, the user must pass the empty string""
, as thestartvalue
, and0
asminactivationchars
. Please note that because the empty string is passed, the data returned will not necessarily be in any specific order, since the where clause would contain “%” only, which matches all of the records, but the order is not guaranteed.
- We updated the
errormsgs_en.sml
– We added the text message equivalents for all of the Superbase Classic-era error messages 1000001 through 1000511.filesyslib.sml
- We improved the
filenameparse()
andcreatepath()
functions so that they correctly handle a UNC path name. Previously they would consider the server name to be a root file name and end up with just\\
resulting in no path name at all. - The
iswindows_os()
function was modified to use the new!osinfo()
system function.
- We improved the
filtergui.sml
– We modified the code so that the select clause it creates automatically wraps field names in double quotes and does not add fields more often than necessary to the output.formlib.sml
- An update was done in the
opendataform1fromstring()
andopenprintform1fromstring()
(clipboard paste) functions to ensure that the content is converted from UTF-8 to UCS2. - We added new functions to the
formlib\controls.sma
file to allow the correcting of an incorrectly spelled field name in a control source. - An incorrect property name was updated in the file
formlib.sma
in the functionxmlsdf1link.getlink()
. - We added the
codepage
element to the DTDs and ensured it is now saved as part of a PPCS data source, when saving the form. It is also checked for when opening a form and used as part of the code for opening tables on a PPCS host. - Changes were made to the functions that merge forms together to ensure that the target form has a master table if it did not have one before. This is primarily used when pasting controls from the clipboard, which are bound to a data source, into the Form Designer.
- The
getnumericvalue()
function was moved fromformlib.sma
intostringlib.sma
. - Support for the
onmouse
event was removed fromdataform1grid
anddataform1datagrid
types and added the new events that are supported:oncellleftclick
,oncellleftdoubleclick
,oncellrightclick
,oncellrightdoubleclick
,onlabelleftdoubleclick
,onlabelrightcick
,onlabelrightdoubleclick
. - Various changes were also made to the code that saves a detail block. Previously, independent of what the original tab order might have been, detail blocks were always output at the start of the page’s controls section. This is no longer the case. The entire code section for the saving of detail blocks has been rewritten.
- An update was done in the
gaugelib.sml
– We added support for the newwxformgauge
component in the gauge dialogs. A new parameter in the.new()
method of thegaugedialog
andmultigaugedialog
types, calledusenativegauge
, defaults to.true
resulting in the operating system native gauge to be used, but passing in.false
will revert to the previous behavior.graphicreportlib.sml
- An update was done in the
opengraphicreport1fromstring()
(clipboard paste) function to ensure that the content is converted from UTF-8 to UCS2. - We added the
codepage
element to the DTD and ensured it is now saved as part of a PPCS data source, when saving the report. It is also checked for when opening a report and used as part of the code for opening tables on a PPCS host. - Alterations were done to the function that merges graphic report forms together to ensure that the target form has a master table if it did not have one before. This is primarily used when pasting controls from the clipboard, which are bound to a data source, into the Graphic Report Designer.
- Problems that occurred when adding a bitmap that is bound to a field in a table to the body of a report were corrected.
- Support was added for the VARIANCE aggregate. To get the Standard Deviation (SD) just take the
sqrt()
of the variance.
- An update was done in the
httpclientlib.sml
– We added support for the HEAD, PUT and DELETE methods and also implemented the chunked transfer mechanism for HTTP 1.1 clients.json.sml
– Some minor but necessary improvements were done.labelslib.sml
- Improvements to the line-closing algorithm were done to consider as movable anything that is located at half the height of the control or lower (previously it had to be below), to allow for scenarios where controls overlap slightly. Special handling was added to ensure that the file name of a
labeldef
is set correctly. - We added the
codepage
element to the DTD and ensured it is now saved as part of a PPCS data source, when saving the label definition. It is also checked for when opening a label definition and used as part of the code for opening tables on a PPCS host.
- Improvements to the line-closing algorithm were done to consider as movable anything that is located at half the height of the control or lower (previously it had to be below), to allow for scenarios where controls overlap slightly. Special handling was added to ensure that the file name of a
mathlib.sml
– There were some odd problems with theround()
function, which have since been rectified. We also replaced thesqrt()
function implementation with a newer version after reports that sometimes internal untrappable errors were occurring.propertybrowser.sml
– We added support for the newoncellleftdoubleclick
event of the grid control to allow that to select and view the double-clicked cell value and also fixed a syntax error in the property browser.q1.sml
– We modified two functions in the query optimizer (q1) to do case-insensitive comparisons for string data, since string indexes are stored case-insensitively.quickreportlib.sml
- Added code page support to the quick report storage and loading.
- The quickreport save file format was bumped to 0.4 and now supports the summarize and distinct options. The
getnumericvalue()
function was removed as it is now part of a lower level library (stringlib.sml
). - The
quickreport1.new()
method was updated to accept atype(sqlq1) query
parameter, which is provided to allow the use of the newodbcsql1
wrapper for ODBC-based queries. - A new aggregate value was added: the VARIANCE aggregate. To get the standard deviation (SD), take the square root of the variance.
- Additional sanity checks were made to ensure that every column in the select statement has a matching
columninfo
entry. This check is done when therun()
method is called.
recordview.sml
- A modification to
trecordview.setfilter()
andtrecordview.setinitialrecord()
was carried out to prevent the re-selection of the record if it is not yet stored. - Code was added to
trecordview
to allow it to be set to read only. - The code for
trecordview.getcolinfo()
was updated to use the newergetnewfieldinfoarray()
instead of the oldergetfieldinfoarray()
.
- A modification to
- repguilib.sml
- We added GUI support for the concatenate operator “
||
” and theSummarize
functionality. - Various fixes were done to the Quick Report GUI including updating the display string when the currently selected column has its heading changed and setting a default string format of
"20"
instead of""
. - Code to limit the output types to window and printer was added to the GUI if the
Summarize
option has been selected (which results in the suppression of row output). Code to initialize theSummarize
andDistinct
options on the form when opening a quick report has been added. - General improvements were done when adding or deleting a column in a quick report.
- We added GUI support for the concatenate operator “
reportlib.sml
– An essential fix was done to thereport1group.findaggregate()
function (never-ending loop) and in thereport1
type definition thequery
property was changed fromsqlq1
into atype(sqlq1)
declaration to accommodate the support forodbcsql1
. Also thereport1.new()
now takes atype(sqlq1) query
parameter to allow anodbcsql1
object to be passed in and thereport1.setorderclause()
function sends theorderclause
through to theodbcsql1
object if there is one. To accommodate the change thatsql1
properties are now read only, thereport1.run()
function now calls the newsqlq1.clearsettings()
function. Sorting is not done on the output from the ODBC layer, since the sorting is being passed through to the engine. Support for theVARIANCE
aggregate was added. Various improvements were done to theupdate.sma
functionality.SBLDateLib.sml
– Changes were made to theDATESTR()
function inSBLDateLib.sma
to try and cope with invalid date format strings being supplied, such as"M/d/yyyy"
.sql1.sml
– We added a(sqlq1)
type tag to thesqlq1
type definition, allowing other code to declare things to be oftype(sqlq1)
, making it possible to be compatible with the newodbcsql1
type, which also has the same type tag. Also many of the properties of thesqlq1
type were changed to be read only since they all had set methods to change them. We added aclearsettings()
method that takes 3 parameters, one for each ofgotrow
,gotallrows
, andprepared
. The propertynulliszero
and associated methodsetnulliszero()
were added to thesqlq1
type as well. The default is.false
, but setting it to.true
will allow numeric fields that have never held data to be treated as containing0
rather than.nul
, which may affect calculations that otherwise would output a value.STR.sml
– We optimized the code that handles characters following the decimal point.stringlib.sml
– Thegetnumericvalue()
function was moved fromformlib.sma
intostringlib.sma
. A new parameter was added to theformatlinebreaks()
function:boolean skipindentonfirstline=.false
. This change allows the indent to be skipped on the first line, which allows for the formatting of hanging indents.tableview.sml
- A modification to
ttableview.setfilter()
andttableview.setinitialrecord()
was carried out to prevent re-selection of the record if it is not yet stored. - Code was added to
ttableview
to allow it to be set to read only.
- A modification to
uisyshelp.sml
- In the
localeinfo.sma
thelocalelanguage
type is now included in thelocaleinfo
type, but only includes thelanguagenameabbrev
property. This works in both Windows and Linux.localecalendar.getdayabbrev()
andgetmonthabbrev()
have reverted to their previous style.localeinfo
now has agetSBLmonthabbrev()
method that returns a string of 3 character month names that are hard-coded and it selects them using the language abbreviation. If it does not find a match, it returns the English ones. - The
maxlength
parameter for thegetuserinput()
function was not implemented. The necessary implementation was added for that parameter.
- In the
Changes to Programs in Superbase NG 2.10
addressbook.smp
– The Linux version of the address book form was updated to the newer storage format.datelibtest.smp
– A new test was added to this program to test the code that was added to theDATESTR()
function inSBLDateLib.sml
.simpolbusiness.smp
- A labels sample was added to the SIMPOL Business tutorial project.
- We added the Quick Report front end, record view and table view to the project.
- The
sbapplication
type was updated with thedialogdata
property for passing around to various parts. - The
onnewrecord
event handlers for record and table view for the various tables were added. - The
onsave
code was modified so that it has a common function called in form, record, and table view. - The
View
menu was added and also code to correctly manage it. TheView
menu is disabled if theORDERMST
table is the master table. - Some hard-coded paths in the
customerlabels.sxl
andcustomerlabels_us.sxl
files were changed.
Changes to Utilities in Superbase NG 2.10
reorganize.smp
– This program was modified to no longer call the code to add in the extended field attributes, since the lower level functioncreate_sbme1table_from_db1table()
is already doing that earlier in the process.sbf2sbm.smp
(Converter for Superbase Classic database files) – Code was added to remove any prefixed “L” character from the display format for a text field. We added code that reports bad structure in the SBF file as an error.sbv2sxf.smp
(Converter for SBV forms into Superbase NG forms) – We added support for DOS code page 850 which is used when converting label and text elements in the form, so that extended ASCII characters do not get lost.
Changes to Superbase NG Personal 2.10
Main Program
Changes were made to accommodate forms not having a mastertable
, and dealing with the switch to record and/or table view and back again. The export functionality now uses the correct path name and target when outputting the results. Import of a new CSV file correctly suggests the input file name and path with a .sbm extension for the new file, and suggests the name converted to uppercase for the table name. Adjustments were made in SBNG Personal to ensure that the record selection tool bar icons are optimized and only used if there are records available. The use of reccount()
has been removed from the selection code since it would be slow in large tables. Some prep work was done for eventually using the appframework
in SBNG Personal.
We added some code to Superbase NG Personal to try and prevent the pasting of one or more records when a blank or modified record is shown on the screen. It should now produce an error message that the record needs to be saved before pasting records.
A change was also made to the code that calls the labels system to ensure that the screen is refreshed when the Label Designer is closed. The reorg table code was modified to take into account that the lower level function create_sbme1table_from_db1table()
now transfers all of the system tables automatically, so this no longer needs to be done in addition by this code. Various corrections were made to ensure consistency in the title bar caption depending on which view is currently open.
Additional code was added to uncheck the Field List menu item if the operation fails or is cancelled.
The duplicaterecord() function was modified so that rather than micro-managing the duplication, it now calls the duplicaterecord() method of the dataform1, printform1, trecordview, or ttableview object.
New Status Reports
In addition to the existing table status and system status reports, there are now status reports for: graphic reports, display forms, and print forms. These can be called from the Utility
menu or via the Print
menu item and selected from the list to be sent to a print preview window.
Table Designer
The createtable()
function in the table design area was modified such that the correct current directory is assigned. There was also a change to the OK button code so that it ensures that the window is closed once the work is done. A major change is the ability to create a new table from a template. Existing tables can be saved as templates from the Utilities menu.
Form / Print Form / Graphic Report / Label Designers
Improvements were made to the fdnewform()
function to better work with the Graphic Report Designer component. Various code changes were made to improve the handling of labels in the Labels Designer component of the Form Designer. There were additional improvements in the Undo functionality for the Label Designer. We also fixed a number of issues related to designing and saving label definitions. Some additional fixes were done to the code that handles creating a new label definition, including ensuring that the dirty flag is reset, the undo manager is cleared of all entries and the window caption for the Label Designer is updated with the appropriate file name. An important fix was done in the label layout design code that would previously result in an endless two-function mutual recursion if the value in the rows or columns was changed.
Work was done to enable tables to link to other tables properly, both in the libraries and in the UI. This means that a link from a table to another table to yet another table will result in all of the necessary record look ups taking place.
We updated the clearformprep()
function in formdesigner.sma
and clearprintformprep()
function in printformfuncs.sma
so that controls that are bound are cleared of their content.
In all of the various designers we added support for the codepage
element of a PPCS data source.
We fixed a problem in the Form/Graphic Report Designer where in the case where controls are being pasted onto a form or report that had no controls or data sources, that the data sources that had been passed to the Form/Graphic Report Designer would not be considered during the process. This resulted in the form or report attempting to open data sources again and in the case of sbme1
data sources, this would fail. Code was also added to ensure that tables are only added to the form or report once, by checking for their presence in the code that transfers data sources that is called during paste operations.
We coded in support for undo functionality to detail block creation in the Form Designer.
Code was added to ask the user if they wish to delete the page in the Form Designer or Print Form Designer if they delete the last control on it.
The wxformgauge
was added as a control to the control ribbon and the Draw
menu plus the new events for the grid controls were added to the relative dialogs for the Form Designer.
We improved the support for adding bound bitmaps to the Graphic Report Designer.
Superbase NG v2.06 Specific Notes
This release contains repairs for several code defects and we also added code page support for various storage formats: form, print form, graphic report, quick report, label definition, and update.
Changes to Superbase NG 2.06
- We fixed a problem with the
setname()
function forprintform1text
andprintform1bitmap
controls that did not maintain the controls array in theprintform1
object to remove the old name and add the new one. This affected primarily the use of the Form Designer when copying and pasting controls on print forms after changing the name of the control that was being copied (label definitions, graphic reports and print forms). - In the warning message shown if a label definition had been changed and not saved when exiting Superbase NG Personal, selecting
Cancel
would not be respected. - Code page support was added to forms, print forms, graphic reports, quick reports, updates, and labels, as well as some bug fixes for labels, including a UTF-8 problem in the embedded print form. In the label layout designer a non-terminated two-function recursion was causing a program hang.
- Modifications were made to the
formlib.sml
andgraphicreport.sml
functions that merge forms together to ensure that the target form has a master table if it did not have one before. This is primarily used when pasting controls from the clipboard in the Form/Report/Label Designer. - We fixed a problem in the Form/Report/Label Designer where in the case where controls are being pasted onto a form or report that had no controls or data sources, that the data sources that had been passed to the Designer from Superbase NG Personal would not be considered during the process. This resulted in the form or report attempting to open data sources again and in the case of
sbme1
data sources, this would fail. Code was also added to ensure that tables are only added to the form or report once, by checking for their presence in the code that transfers data sources that is called during paste operations. - Some additional fixes were done to the code that handles creating a new label definition, including ensuring that the dirty flag is reset, the Undo Manager is cleared of all entries and the window caption for the Label Designer is updated with the appropriate file name. An important fix was done in the label layout design code that would previously result in an endless two-function mutual recursion if the value in the rows or columns was changed.
- We added some code to Superbase NG Personal to try and prevent the pasting of one or more records when a blank or modified record is shown on the screen. It should now produce an error message that the record needs to be saved before pasting records.
- A change was also made to the code in Superbase NG Personal that calls the labels system to ensure that the screen is refreshed when the Label Designer is closed.
Superbase NG v2.05 Specific Notes
This release contains numerous improvements and a few minor bug fixes.
Changes to Superbase NG 2.05
Documentation Changes
In our tool chain we have a number of programs that help us assemble the Language Reference Manual. We made a change to one of those programs that retrieves the information from the libraries so that it now also retrieves the type tag information for types, so these should start appearing in the reference manual.
Program Changes
sbf2sbm.smp
– We added code to remove any prefixed “L” character from the display format string for a text field.sbv2sxf.smp
– We added support for code page 850 (via the changes to thecodepageslib.sml
) when processing label and text elements from the form to ensure that extended ASCII characters are correctly converted.
Library Changes
codepageslib.sml
– Support for DOS code page 850 was added to the library.commonreportgui.sml
– Added the missing implementation of theTRIM
functionality from the GUI for report filters and calculations. Also provided support for the concatenate operator||
.databaseforms.sml
– Thedataform1.setmasterrecord()
method was not rereading the detail block entries after being called. Also numerous changes were made to this and supporting libraries downstream to allow for a form not having a master table. Prior to this, a form that had no master table, but which had a data source as say the source for a data list in a list or combo box, would set that table as the master table, even though it shouldn’t have been. This change will allow better support in future for unlinked detail blocks. Work was also done to enable tables to link to other tables properly, both in the libraries and in the UI. This means that a link from a table to another table to yet another table will result in all of the necessary record lookups taking place.db1util.sml
– Fixed a problem that turned up when converting older Superbase files that had not been reorganized in Superbase 95 or later. The SBD could contain a format that began with the letter “L”, but which was no longer supported in later versions of the file format and would have been removed. We also discovered that there is a discrepancy between the way the Superbase field formats for text,C
(capitalize field) andW
(capitalize each word), are handled compared with the way it is done in SIMPOL. In Superbase the value appears to be converted to lower case before having the function applied, but not in the SIMPOL versions. This has been resolved by creating two new functions:TCASE()
andFCASE()
indb1util.sml
. Unlike the.tcase()
intrinsic function and thefcase()
function, the upper case versions first convert the value to lower case and then apply the.tcase()
/fcase()
functions to the result. These two functions are now used for assigning values to fields where appropriate.displayformats.sml
– We fixed a problem where the display format “.” was not being correctly handled by the user-interface.errormsgs_en.sml
– The string equivalents for all of the Superbase-era error codes 1000001 through 1000511 were added.filesyslib.sml
– We fixed thefilenameparse()
andcreatepath()
functions to correctly handle UNC path names (the initial part of a UNC path name like\\servername\dir\myfile.txt
is\\servername
, not\
or""
).formlib.sml
– A modification was made to the functionsopendataform1fromstring()
andopenprintform1fromstring()
to ensure that the content is converted from UTF8 to UCS2 (these functions handle pasting controls from the clipboard in the Form Designer). We also added support for asking the user to replace the data source if it cannot be found when opening a form or print form as well as added the code to ask the user to select a replacement field if, during the opening of the form and trying to resolve the data source for bound controls, the field cannot be found.graphicreportlib.sml
– We updated the functionopengraphicreport1fromstring()
to ensure that the content is converted from UTF8 to UCS2 (this function handles pasting controls from the clipboard in the Graphic Report Designer). We also added support for asking the user to replace the data source if it cannot be found when opening a graphic report. To this we added the code to ask the user to select a replacement field if, during the opening of the report and trying to resolve the data sources for bound controls, the field cannot be found.labelslib.sml
– Improved the gap-closing algorithm to consider anything that is located at half the height of the control or lower (previously they had to be below), to allow for scenarios where the controls overlap slightly (in order to size them large enough to show in all resolutions, text controls often need to be sized larger, but they can then be overlapped to allow for a smaller overall line height). Special handling was inserted to ensure that the file name of a label definition is set correctly. We also added support for asking the user to replace the data source if it cannot be found when opening a label definition. To this we added the code to ask the user to select a replacement field if, during the opening of the label definition and trying to resolve the data sources for bound controls, the field cannot be found.q1.sml
– This was modified to ensure that in specific circumstances, case-insensitive comparisons are done for string data, since string indexes are stored in a case-insensitive way. Previously, under certain circumstance, not all records might have been retrieved when using a filter condition (WHERE clause) that used an index field with various fields with the same index value but which were not identical (varying in case).recordview.sml
– Thesetfilter()
functionality was modified so that it will not re-select the record if the record has not yet been stored.repguilib.sml
– Support for the Summarize functionality in a Quick Report was added to the user interface. Also we made various updates to the Quick Report GUI including updating the display string when the currently selected column has its heading changed and setting a default string format of “20” instead of “”.sbldatelib.sml
– We made changes to theDATESTR()
function to try and cope with invalid date formats that can be supplied by the operating system, such as “M/d/yyyy”. This has resulted in a new test case being added todatelibtest.smp
.tableview.sml
– Thesetfilter()
functionality was modified so that it will not re-select the record if the record has not yet been stored.uisyshelp.sml
– We discovered that the operating system in certain locales was returning a string with more than 3 characters for month and potentially day name abbreviations. That was causing problem with the parsing of those values when converting them from a string back to a date. We initially thought to add code to truncate these strings to 3 characters in length in the functions:localecalendar.getdayabbrev()
andgetmonthabbrev()
, but that resulted in the same three letter being used for more than one month in some cases. Eventually we decided to hardcode the month name abbreviations and select them based on the current language retrieved from the operating system. If we don’t support a specific language, it reverts to English.
Changes in Superbase NG Personal
Many of the changes to the various libraries above have also found their way into Superbase NG Personal, since it is built on top of those libraries. In addition, some specific work in the Superbase NG Personal code was required to cope with those changes.
- Modifications were done to accommodate forms having no master table and then switching to table or record view and back again.
- Table Designer – The wrong current directory was being assigned when a table was created.
- Form Designer – Various adjustments to the code were done to better handle the Graphic Report Designer when creating a new form or report. Similar modifications were undertaken to improve the overall handling of labels in the Label Designer portion as well as fixing some defects in the Undo functionality for labels.
Superbase NG v2.02 Specific Notes
This release contains a very important bug fix. It was sufficiently important that we rushed it out with a new revision number. Thank you to the customer who led us in the direction of this bug.
Changes to Superbase NG 2.02
Program Changes
There are numerous changes to programs throughout the package, as a result of a change to the STR.sml
library, which is included almost everywhere, either directly or indirectly.
Library Changes
str.sml
– TheSTR()
function was using an unoptimised algorithm when assigning a value to a string. The result was that in some cases, decimal values as a result of division could have more than 700,000 significant digits and were causing the conversion to a 2-decimal value to take over a minute. A new, optimised approach to handling these extreme cases was established and implemented.
Superbase NG v2.01 Specific Notes
This release contains some very important bug fixes and a few enhancements. As with any product with a large number of new features and changes to existing ones, a few things can get missed. We would like to thank every one of our customers who contacted us and provided us with bug reports and reproducible examples so that we could find and fix the bugs.
Changes to Superbase NG 2.01
Program Changes
simpolbusiness.smp
– We replaced the olderinvoice.sxr
with a newer version that works without any additional code. The source code of the example has been modified to reflect the changes. We also added a labels example to SIMPOL Business to show how to integrate a Superbase NG labels definition file (*.sxl
) into a program. We also commented out the “Test Function
” entry in theReports
menu.sbf2sbm.smp
– Import from an SBF file was not removing the leading L character from display formats for TXT fields (these are not supported in v3 Superbase releases). This caused them to be interpreted as L for lowercase (which is meant to be a suffix, not a prefix to the display format). This can happen if the tables have not been reorganized in Superbase version 3.x or later before they are imported. Adjustment was made to the core code that handles the interpretation of the display format and also in the import tool. It is important to remember that the SBF converter expects the database file to have been reorganized before conversion.
Library Changes
databaseforms.sml
–dataform1
was being marked as dirty when it created a new blank record.displayformat.sml
– Thevalidatedisplayformat()
function was not correctly handling the “.” display format for numbers and was changing it to “”.labelslib.sml
– Loading a labels file did not take into account the system locale for paper size. The way labels closed up controls wasn’t working if the controls overlapped, which is common to allow the fonts to be fully shown in print preview. Now they allow controls that are located up until half the height from the top of the reference control.q1.sml
– We fixed a bug in the query optimizer, which affects all of the reporting engines. Superbase NG table indexes are case-insensitive and range calculations were working as case-sensitive. That resulted in queries not finding all values in an index range if the same value was present in various forms (such asMiller
andMILLER
) because the range system would exit if the value in the indexed field of the record being tested was not equal using a case-sensitive comparison.
Changes in Superbase NG Personal
- Copying Form Designer content to clipboard and pasting it caused the UTF-8 to not be properly converted back to UTF-16.
- In an import, selecting a CSV file that was already open (say in Excel), would cause the program to crash. Now it reports the error that the file is unavailable.
- Creating a new table didn’t add it to the most-recently-used (MRU) list.
- File extension checking on arguments passed on the command line to Superbase NG Personal was case-sensitive. It now checks the operating system and on Windows is not case-sensitive.
- Creating a new table when previously in table view switched to record view, now it stays on table view.
- There were problems with the Label Designer and undo, saving, and then updating the original form. We also added code to prevent the saving of a label definition with a page size that does not match the print form page size.
- Added support so that labels files could be double-clicked and opened, as well as making sure that the undo files are correct and supported for the Labels Designer.
- Removing a table didn’t remove it from the MRU list.
- Form view in Superbase NG Personal did not show the Save menu item when the table was empty, even after a new unstored record was created.
IDE Update
IDE languages were not getting copied from HKLM to HKCU on a new installation. This has been fixed, but if you have the problem, you need to close all copies of the IDE and remove the HKEY_CURRENT_USER\Software\SIMPOL key using regedit.exe. The next time you start the IDE, it will recreate the key and its entire tree.
Important Note
Locking a record while working with PPCS and then while it is locked doing record selects, even with a different table object, causes the server to unlock the record, but it believes it is still locked in the program (client-side). Attempting to save results in the error code 1000177 (record is not locked). Currently the only workaround for this is to use a second ppcstype1 object to select the records. We are researching this currently.
Superbase NG v2.0 Specific Notes
In this major release of Superbase NG there are a number of new features, changes, and bug fixes that have occurred since the previous 1.83 release of SIMPOL Professional. The first obvious change is the renaming of the product back to Superbase. Superbase Software Limited owns the intellectual property of both Superbase and SIMPOL, and has chosen to rename the SIMPOL Professional product back to its originally intended name of Superbase NG. With this major release, there are a number of new features as well as numerous changes to the existing feature set.
New Features in Superbase NG 2.0
With this release we have added some exciting new features to the product. This is the first release of the NG line where we have had a Graphic Report Designer which is now part of the Superbase NG Personal program. With that addition we feel we have finally turned a corner with the product and it now has the majority of features that were core parts of the old Superbase line. Some parts have been allowed to drop as not being required, such as native dBase support. Some features that are standard in Superbase NG were never part of the old Superbase, such as direct support for TCP/IP sockets. Here are the lists of the new items.
New Programs
calcevaltest.smp
– This is a test suite using theunittest.sml
library for thecalceval()
function in thecalceval.sml
.consoletest.smp
– This is a test program for the newconsolelib.sml
that provides an interactive console environment for console-style programs.fcasetest.smp
– This provides a test program for thefcase()
function usingunittest.sml
.filetypetest.smp
– Here is a regression test program for the newfindfileencoding()
function instringlib.sml
.fixtest.smp
– This is a regression test for the.fix()
function.saveimagetoblobgui.smp
– This is a dialog based version of thesaveimagetoblob
program, which can do multiple images in one pass and save all image source code output into one file.sbm2smagui.smp
– This is a dialog based version of thesbm2sma
program that converts Superbase Micro Engine database tables to source code.sbv2sxf.smp
– Using a similar user interface to the Superbase data file conversion program, this is a SIMPOL language-based Superbase form converter. It converts files inSBV
format directly to SIMPOLsxf
format. It does not yet handle reports. One big advantage is that this program can extract embedded images and save them off as image files.
New Libraries and New Functionality in Existing Libraries
conflib.sml
– This library has a new function calledgetallprofilestrings()
that can retrieve all of the entries in a section of an INI file.consolelib.sml
– This new library provides a console environment for creating interactive console-style programs that can read from and write to the console. This makes it easier to create quick programs for learning the language without requiring all the complexity of working with graphical user interface elements.filtergui.sml
– This library provides a selection list tool in the form of a non-modal dialog with a grid and callbacks to a user-provided function to act on changes to the row selected in the grid. The tool carries out a query based on a filter passed to it. The query is run in a separate process and can be interrupted by closing the dialog. This can be seen in action in Superbase NG Personal and has also been added to the SIMPOL Business tutorial example.logmanager.sml
– The log manager project was created to allow multiple threads to write to a file-based log without losing any entries or having collisions during file access. This is done by providing a queue that can be added to and a dedicated process that writes to the log file from the queue. (This libarary has since been upgraded to thefilesyslib.sml
– Thecopyfile()
function, which does what the name suggests, was added. We implemented thesetcurrentdirectory()
function, working on both Windows and Linux, to allow the program to change its current working directory. Another new function,createpath()
was added which recursively creates every element of the path passed. Thegetdefaultnewline()
function was added to return the appropriate newline character for the current OS.sbnglib.sml
– Added thefletcher16()
andfletcher32()
checksum generation functions.sortlib.sml
– Theobjinsertionsort()
function was added for sorting objects using a callback function for comparison. A set of very powerful automatically sorted search trees were added. The implementation resulted in the following new types:TreeNode
,BinarySearchTree
, andAVLTree
types. A dependency on thelists.sml
was added because thelist
type is part of theBinarySearchTree
andAVLTree
types in order to support duplicates at a specific tree node as part of theBinarySearchTree
implementation. TheAVLTree
is a special version of theBinarySearchTree
type that ensures the trees are as balanced as possible, which can significantly improve performance with large trees.
Changes to Superbase NG 2.0
Program Changes
addressbook.smp
– Thetoolbarcomboevents()
function was modified to use the newappwindow.setcurrentindex()
method.convert.smp
– This program was updated to be in line with the current state of the Mac OS-X operating system. It was also updated to use current SIMPOL
programming conventions.demo.smp
– Fixed a problem in the code. Also removed the now unnecessary code forwxformoptiongroup
andwxformoptiongroupmember
types since they are part
ofuisyshelp.sml
.importppcs2sbme.smp
– This was one of the oldest examples, so we did a complete rework of the code to modern standards.jdktutorial.smp
– We updated the code that handles fields so that it uses the member operator (!) instead of field reference variables.ole2excel.smp
– The program was updated and tested against Office 2010. It now creates a chart, copies the chart to the clipboard and pastes it into the form in the Superbase NG program. It can also print the results in landscape mode.sbair.smp
– Thetoolbarcomboevents()
function was modified to use theappwindow.setcurrentindex()
method.sbf2sbm.smp
– We removed the command line toolsbd_formula_reader.smp
and added its code that converts SBD formulas to SIMPOL source to this graphical front-end that converts the databases. This feature can now be used while converting the data, a more natural location for it.simpolbusiness.smp
– To this project we added support for the newfiltergui.sml
library to demonstrate the creation of selection lists.worm.smp
– This program now has a dependency onuisyshelp.sml
. We added the ability to switch between various game board sizes, all based on the size of the screen. We set the starting size to be the third of four board sizes, starting with full screen and reducing to 3/4, 1/2, and 1/3 of the available screen size.- We modified the
guisimpolserver.exe
,simpolserver.exe
, andsimpolserverclient.exe
programs to test for multiple data file paths. If they are found, a message is issued in the GUI and written to the log that multiple data paths were found and the reorganize, backup, and restore functions have therefore been disabled. This is necessary because the current backup code assumes that all the database files are in the same directory.
Library Changes
appframework.sml
– Theappwindow
type has a new method:setcurrentindex()
, which can automatically ensure that the index combo is correctly updated. It also reselects the current record in the current view mode so that it is on the new index and sets theappwindow.lastselkeyvalue
to.nul
. The framework can now automatically show scrollbars if required when the window is resized if the form too large. We ensured that inappwindow.openformdirect()
a specific call todataform1.selectfirst()
is made. We also modifiedappwindow.createformdirect()
to use the newer parameter list for the call using thecreateformfunc
parameter and also expressly setappwindow.viewmode
tosFORMVIEW
in the same function. A discovery we made resulted in necessary changes to thedeferprocessing()
function. Apparently the default values are not assigned when a function is called using!beginthread()
. We also added field selection list (dataview
) support to theshowtableview()
andshowrecordview()
functions and as required to various other components.MAJOR CHANGE: We added the selrec() etc. functions that were originally in the tutorial applications to theappframework.sml
. In the process changes were made to ensure that if a record is saved in any view mode, and there are already existing view modes opened, but not currently shown, that the changed record is updated in the other view modes.We added thewindowlist
property to theappwindow
type. This was part of adding support for using the new filtergui, though that library has not been added to this one. This also included atdataview filterview
property forappwindow.
We created the functionremovedialogfromlist()
for assignment to theonvisibilitychange
event of the dialog. That way if the user closes the dialog, this code will remove the element from thewindowlist
array. Though it works as intended, this area is still a work-in-progress.calceval.sml
– We removed an unnecessary parameter from thecalceval()
function and improved the__lex()
function so that it correctly handles identifiers that are wrapped in double quotes. We also added support for the SQL 92CAST
function as well as theAS
key word to thecalceval()
function.commonreportgui.sml
– In order to facilitate re-use of certain interface components we extracted functionality from therepguilib.sml
library and created the newcommonreportgui.sml
library to hold that functionality at a point where it can be included earlier in the library structure. This required various modifications and the addition of some callback functionality. As part of that, we added thecommonfilterinfo
andcommonorderinfo
types.One common request, was that it should be possible to edit the filter directly. To make this possible, we added theEdit Mode
checkbox to the filter dialog as well as adding the necessary support so that it can be used correctly. It is not permitted to edit the filter while in the middle of using one of the more complicated button commands, that hae multiple stages and those buttons are disabled while inEdit Mode
.We changed the position of some controls and added theNOT
and theCAST
buttons to the filter dialog and removed theNOT LIKE
button. Thedoorder()
function was changed todoreportorder()
. We also exported the functions:__rep_movetop()
,__rep_moveup()
,__rep_movedown()
, and__rep_movelast()
. The functionuparrowoutputrow()
used for reporting errors from thesqlq1
methods was added as an exported function. Thedofilter()
function was modified so that it takes a “type(dataform1) form
” parameter, which is now passed tocommonfilterinfo.new()
indofilter()
. In the function:__rep_flt_columns_osc()
we switched from using thegetcolumndatatype()
method to thefindcolumndatatype()
method, since the latter works even if theprepare()
method of thesql1
object has not yet been called. Support was added for handling cancellation of certain items like the date and time dialogs when used in the middle of another mode such asEXTRACT
. Cancelling previously resulted in an unhandled program error. As part of this bug fix we added support to various of these functions so that the cancellation can be passed back to the calling function. Support for the NOT operator was added throughout. In the__rep_flt_join()
function the parameter “dataform1 f
” was changed to a “type(dataform1) f
” declaration.conflib.sml
– This project now requires theutf8lib.sml
library. We added support for detecting and correctly handling configuration files that have been stored in UTF-8 format if they are marked with a byte order mark.databaseforms.sml
– Thedataform1record
type’sisdirty
property is now not being set so aggressively. Thedataform1record
type’stype(db1record) record
property is now read only, and asetrecord()
method was added. Thedataform1.addcontrol()
method has a new parameter,suppressfill
, to prevent the filling of the list or combo control on create. Thedataform1
type’smasterrecord
andlastusedrecord
properties were made read only. We added thesetmasterrecord()
method so that the record passed can be properly assessed. We also added thegetlinkedrecord()
method to retrieve a record that is linked to the master record, by passing the tablename. Adding a data source no longer marks the form as dirty. In thedataform1detailblock
type the scrollbars can now have horizontal scrollbars at top or bottom as well as left or right. This makes sense if the number of columns exceeds the number of rows. We modified thereplicatecontrolindbunit()
function so that generated detailblock controls do not use the same naming convention as the names that are auto-generated for
regular controls, in order to avoid an accidental collision between detail block controls and controls that might be added after the detailblock is built. We also added a safety check to thedataform1settext()
function to ensure it doesn’t check for the presence of amasterrecord
if the form is in design mode, but if it is not in design mode, it will also call thedataform1ongotfocus()
method if the record is not marked as dirty, to ensure it gets locked.We added some more code to thedf1droplistinfo
type, which is used for drop lists associated withdataform1edittext
controls. This is to ensure that the list correctly closes and also correctly places focus in the appropriate control afterwards. We also fixed a bug in this area where the max search entries was not being checked against.A potential lock leak indataform1.setmasterrecord()
was fixed where if a record had already been locked, it would not have been unlocked when the record was replaced. A problem was resolved that was introduced when theappframework
began using embedded child windows for forms, which added an extra layer of windowing, so that caused the code that previously would post to the status bar to display awxmessagedialog
instead, resulting in a never ending cycle that the original code had been implemented to prevent. Support was added to bothdataform1
andprintform1
so that they carry an additional property calledcurrentworkingdirectory
. This is set in theformlib.sml
code when the form is opened to be the same as the directory where the form was located. It is only used to build a full path when retrieving an image from a record for display in adataform1bitmap
and only then if the path does not start with eitherhttp://
orfile://
and is a relative path (doesn’t start with either: adrive letter:\
,\\
, or/
(on Linux)). We also ensured that when callingdataform1.setmasterrecord()
, if the record object is.nul
, that the form will be blanked.We fixed an internal problem where every detail block unit was being marked as master, rather than only the first one. We also fixed thedetailblocksection.remove_dbunit()
method so that it only removes controls from the form if they are not marked as master. Additional sanity checking was added when creating a detail block so as to ensure the result will fit in the available space. We made changes to ensure that calling thedataform1detailblock.remove()
method cleanly removes the detail block but leaves the master controls behind.The typesdataform1control
anddataform1graphic
were added to allow the IDE to do provide inline help for declarations oftype(dataform1control)
andtype(dataform1graphic)
. Agetdatasourceinfo()
method was added to thedataform1datasource
type to make it easier to convert fromdataform1datasource
todatasourceinfo
. A similar mechanism was added for tables. Thegettbinfo()
method is now part of thedataform1table
type, as is agetfieldinfo()
method that returns adb1fieldinfo
object (see the entry fordb1util.sml
below) for the field name that is passed.There is a new array property for thedataform1table
callednewfieldinfo
, that contains an array ofdb1fieldinfo
objects, one for each field in the table. Thedataform1page
andprintform1page
types have a newremove()
method. A bug fix was implemented for thedataform1detailblock.addrowdata()
method. Previously, calling this method would have caused a runtime failure. Error handling in theprintform1page.addcontrol()
andprintform1page.addgraphic()
methods was improved.Various changes were done indataform1.setmastertable()
,dataform1.selectcurrent()
,printform1.setmastertable()
, andprintform1.selectcurrent()
. These changes were added to work around a problem we recently discovered with theppcstype1
component where if a record was selected using an index that allows duplicates, and if the field value that is the selection index is changed, then after saving and doing aselectcurrent()
on the record object, the wrong record is returned. This is a very specific case and we will be repairing it as soon as we are happy that we have correctly isolated the circumstances that cause it. We modified thedataform1.addpage()
andprintform1.addpage()
methods so that the form is only set to dirty if after adding the page there is more than one page.db1util.sml
– In prepration for future enhancements that are planned, we added the following extended field information fields:defaultformula
,calcformula
,valformula
,readonly
, andrequired
. We also added default values for the equicalent parameters in the existinggetfieldinfoarray()
and the newgetnewfieldinfoarray()
functions and updated thedb1fieldinfo
type. We have switched internally to using thegetnewfieldinfoarray()
function. We modified the functionsgetuniqueindex()
andgetuniquenindex()
to compare against"== .true"
instead of"!= .false"
, because theindex.unique
property might be equal to.nul
. We have updated thelockrecord()
function to act the way it was intended to. It was meant to attempt to lock the record and if it failed, return the original (unlocked) record. It wasn’t doing that, so it has been changed accordingly. It now returns the unlocked record if it fails, and the error value should be checked for success.dbconverter.sml
– There was an issue with the wrong assignment operator being used in thesbme1
export converter that has now been corrected.drilldown.sml
– Thedrilldown()
function now hasforceupper
andforcelower
options to force the input to be forced to upper or lower case before searching. Thedrilldown()
function now takes two additional parameters, asetfilterhandler
function parameter and atype(*) reference
. If the handler is defined, then that function will be called to construct the filter. The prototype of the user-supplied search filter function is searchfilterfunction(string s, type(*) reference), where the s parameter contains what the user has typed (converted to upper or lower case if those parameters were set). This allows the caller to construct the filter themselves, in cases where they wish to look in multiple fields for the same string, for example. We increased the amount of space available for the search message in thedrilldown.sma()
andtablesearch.sma()
forms to roughly the entire width of the dialog minus the margins. Thetablesearchfrm.sma()
form now properly supports the passed in caption, OK and cancel button text. The main loop that handles the querying was modified to respond to the user changing the content (by typing additional characters) so that the query is broken off immediately if the typed content has changed length, and then it will start a new query).filesyslib.sml
– Thecopyfile()
andsetcurrentdirectory()
functions were added. Thecreatedirectory()
function was improved so that it strips trailing directory separator characters before checking if the directory already exists. A new function,createpath()
, was added that will recursively create every element of the path passed and another new function calledgetdefaultnewline()
was added to return the appropriate newline character for the current OS.formlib.sml
– There were numerous fixes to the code that generates a source code program for thedataform1
forms. An important change is that the primary parameter passed to the resulting function is oftype(appwindow) appw
rather thantype(application) app
. In addition work was done to ensure that only relevant parameters are output and that the code compiles without warnings. Numerous improvements were made in the source code generation of adataform1
form. Additional code was added to assign thedataform1link
property ondataform1bitmap
andprintform1bitmap
objects, the lack of this assignment resulted in the situation where if a table was linked 1:1 and adataform1bitmap
orprintform1bitmap
was placed from the linked table, it would not show the image because the link wasn’t there to find the record. Support was added for the newcurrentworkingdirectory
property of bothdataform1
andprintform1
during the loading from file so that relative paths work better when displaying images that are located relative to the form file location. We modified the display form storage format and the source code generation to store the column widths of adataform1grid
so that these can be set in the design tool and so that they are preserved. In the loading code fordataform1
andprintform1
, we switched to usingsetmastertable()
instead of directly assigning the master table in preparation to eventually making themastertable
property read only. There were some minor changes to how list source entries are read when a form is loaded. The code that associates a table with a form was enhanced to ensure that priority is given to already open tables before attempting to load one from the stored information. We fixed the load of a display form so that once all of the pages and controls have been loaded, thedesigndpi
property is set to the value of thecurrentdpi
property and thedpiadjfactor
property is set back to 1 (since at this point, the form has been built according to the value in thecurrentdpi
property, so should anything later be added, it will be sized correctly).gaugelib.sml
– Themultigaugedialog
type had support for theshowcancelbutton
parameter added.graphicreportlib.sml
– Moved from format version 0.3 to 0.4 forgraphicreport1
. This added the following properties:distinct
,outputtarget
,promptfordestination
,allowuserdeffilter
,allowuserdeforder
,hidespecifiedfilter
, andhidespecifiedorder
. Thesqr1table
was given themaster
attribute. The project now includesuisyshelphdr.sma
. We added theprintform1graphic
type tag to thegraphicreport1
graphic types. We created theremove()
method for thegraphicreport1formpage
type and added code to assign the control source to a display control if thecreatedisplayform
property is set to.true
. The helper functiongetcontrolsourcefromcolno()
was created to support retrieving the correct control source so it can be assigned. The graphic report now has optional gauge support (similar to the quick report). Numerous other changes were done to support the creation and modification of graphic reports using a design tool. We made possible user-defined filters and orders at run time. There were also numerous code improvements. We handled a possible race condition in the code that removes a page. Thegraphicreport1form
type definition now has the additional type tag(dataform1linkcontainer)
. Adding a page or a control on a page now sets thegraphicreport1
object’sdirty
property to.true
. Removing a control, graphic, or page from agraphicreport1form
sets thegraphicreport1.dirty
property to.true
. Various improvements were made to the assignment of tables as controls’ sources. We added the report target selection dialog form. A place in the save code for the graphic report where a double conversion to XML was taking place was fixed.httpclientlib.sml
– This library was updated to better support debug output. We added a time stamp to the debug output and debug output now uses thelogmanager.sml
to handle multi-threaded log writes. Thehttprequest
type was changed so that when it is retrieving the header, that if theaccept
property is empty, then no accept header will be output.
We also added cookie support to thehttprequestheader
andhttpresponseheader
types together with appropriate methods.labelslib.sml
– The labels engine was updated to also provide an optional progress meter while running, similarly to other report modes. The file format was changed so that theprintform1
used for the label is now embedded in the*.sxl
file rather than being an associated*.sxp
file with the same name. The older format is still supported but when saved it will be saved in the newer format.printformlib.sml
– Thepagesetupinfo.new()
method now takes thepapertype
,units
,isportrait
, andfont
parameters. We fixed an error where thedialogdata
property of theparams
parameter to theprintwxform()
function was not being passed on when it was present if the output target was print preview. Theprintwxform()
function now requires a newpagesetupinfo psinfo
parameter so that the user-selected page orientation is supported.quickreportlib.sml
– This librry now exports thegetprinttextextent()
function for assessing the required print size of a string. Additional sanity checks were added to thequickreport1.addaggregate()
method and it was also modified to usequickreport1.getcolumndatatype()
and only if that fails to fall back tome.findcolumndatatype()
. The export keyword was also added to:getaggtypestring()
andgetaggtypeidfromstring()
. Quick reports were not using the users locale for list separator characters because the locale information had been hard-coded. It now creates a newlocale
object which interrogates the operating system for the locale information.recordview.sml
– Thelastusedrecord
property of thetrecordview
type is now read only and there is a companionsetlastusedrecord()
method. We fixed an error in thetrecordview.saverecord()
method that was calling a non-existent (sbme1
)rollback()
method forppcstype1file
objects. The library now has a dependency onconflib.sml
. This was part of adding support so that record view, if provided with an INI file name upon creation, can retrieve the row height settings for that table name from the INI file and store them if they are changed from the defaults. We also added support to work around the problem inppcstype1
that was established with respect to doing aselectcurrent()
method call after changing the value of the record’s indexed field.repguilib.sml
– Numerous changes were done to ensure that theCalculate
button for creating calculated columns in the quick report works properly, supported by a Calculation dialog, and ensuring that theAS
name is correctly represented throughout with double quotes if it contains a space. We also enhanced the group, filter and order portions to correctly support theAS
name of the calculated column. As part of the same work we added support for theModify
button for modifying a calculated column. The front-end support for the update functionality was added to this library. The functionquickreportwindow.new()
no longer takes awxfont font
parameter, but instead takes apagesetupinfo psinfo
parameter, which provides the font and more information as well. The problem that was solved was that the paper size and type as well as the margins were all previously hard-coded. Now, they inherit these values from thepagesetupinfo
type. Various other improvements were made to the Quick Report GUI. It now remembers which output target was last in use and sets that output target as the default if the report is placed back in the user interface tool.reportlib.sml
– We added a new function:lexorderclause()
to improve the parsing done inparseorderclause()
. It now copes with column names that contains spaces and which are wrapped in double quotes, such as those that might describe a calculated column. To this project we added theupdate.sma
file and the new update engine. This also includes the loading and saving of updates so this required adding four libraries to the project:sbnglib.sml
,libxml.sml
,filesyslib.sml
, andcalceval.sml
. It also added thelxml
C-language component to the project. To support the GUI when analysing a report during design thereport1.findaggregate()
andreport1group.findaggregate()
methods were added.sbldatelib.sml
– Improvements were made to thestring2date()
function to make it more robust when bad data is passed to it.sbnglib.sml
– We updated thetablestatus()
function so that it also outputs the total number of fields and indexes. Thewxformoptiongroupmember
,wxformoptiongroup
, and related functions were moved to theuisyshelp.sml
library so as to remove the dependency of this library on thewxwn
component.sendmail.sml
– Thesendmail()
function now has a debug feature. We changed the position of the code that processes attachments so that it increments only if there is something to process.simpollib.sml
– We fixed a problem with theisproperty()
function.smtpclientlib.sml
– Thesmtpmessage
type now has adebug
property.smtpdatelib.sml
– We added thegettimezoneinformation()
function for both Windows and Linux.sql1.sml
– Thefindcolumndatatype()
method was added to thesqlq1
type. This method, unlike thegetcolumndatatype()
method, does not rely on the query already having been successfully prepared. Thesqlq1.findcolumnsource()
method was added. We made numerous improvements to thesqlq1.findcolumndatatype()
method so that it is more accurate (though still not perfect). This works without callingprepare()
, but if the query has beenprepare()
‘d, then it is better to usesqlq1.getcolumndatatype()
. Added support for theCAST
operator in our SQL 92 implementation as well as support for the NOT key word. Thehastable()
method was added to thesql1q1
type to allow it to check if a table of a given name is part of the table list for the query.stringlib.sml
– There is a newparsemultitoken()
function that is similar to theparsetoken()
function but which can stop on multiple tokens and reports which one it found.tableview.sml
– Thettableview
type’slastusedrecord
property is now read only, with a new companionsetlastusedrecord()
method. Improvements to calculate default column
widths in table view were made. The library now has a dependency onconflib.sml
. This was part of adding support so that table view, if provided with an INI file upon creation, can retrieve the column width settings for that table name from the INI file and store them if they are changed from the defaults. We also added support to work around the problem inppcstype1
that was established with respect to doing aselectcurrent()
method call after changing the value of the record’s indexed field.uisyshelp.sml
– We added thegetwindowsfolder()
andgetwindowspublicdocsfolder()
functions to the library to provide a consistent and reliable way to retrieve the correct location of the “C:\Users\Public\Document
” and other system folder locations (Please note that on Windows 10, some of these locations can be virtualized when using UAC.) Some additional error checking was added to thegetuserinput()
function. Thewxformoptiongroup
,wxformoptiongroupmember
, and supporting code was moved into this library from thesbnglib.sml
library so that library could remove its dependence on thewxwn
component. This required adding thelists.sml
library to this project. We also updated thedatepicker()
function by adding a new parameter:boolean weekstartonmonday=.true
. This retains the default behavior, but if set to.false
, it will show the calendar with the week starting on Sunday for North American customers. We also added theshowcopyabletextmessage()
function to allow an easy method of showing a text message that is multi-line and read only and which can be copied to the clipboard. The functiongetusabledisplaysize()
has been enhanced to now accept theleft
andtop
integer parameters. This accommodates the situation where the task bar is not at the bottom of the screen, but at the top or the left. In these cases, theleft
andtop
parameters will be filled with the correct offset of the usable display area. The functionsgetcenteredwindowrect()
,centerdialogonparent()
, andcenterwindowondisplay()
have been updated to work correctly with this change. A new function has been added for Windows users, called:getwindowstaskbarstateandpos()
. This takes twopoint
objects left-top (lt
) and right-bottom (rt
), aboolean ishidden
, and aninteger edge
parameter. A new user-interface feature is thechoicelistdialog()
function. It is fairly flexible and can display a list of choices in a dialog. If the flagonlyone
is set to.true
, then it will display the entries as check boxes, if not, as option buttons. It returns an array where each element is set to.true
or.false
depending on whether it was selected or not. The array elements correspond to the position of the items in the original choice array.uuencode.sml
– We changed the implementations ofbase64encode()
andbase64decode()
to use API calls on Windows and Linux. A fallback is provided to the older implementations if the API calls are unable to be obtained. This change means thatbase64encode()
always returns a string with a trailing carriage return linefeed pair (previously it did not have this trailing character pair).
Changes to Superbase NG Personal
The Table Designer now supports the extended attributes (but they are not yet supported fully in the system) and we fixed the addfield(), deletefield(), tabledefok() and tabledefcellselect() functions to ensure that parts would not be called if the container file does not have the system tables.
The new Graphic Report Designer has been added to the package and work has been done to ensure that the graphicreport1
group of types is more thoroughly implemented than it had been previously. We added the graphicreport1form.findcontrol()
and graphicreport1form.findgraphic()
methods as well as additional features required by an interactive design tool such as the new Graphic Report Designer, including a setpapersize()
method for the graphicreport1
type.
We made various changes to the import merge functionality so that if the target table does not have a unique index, then the index options are disabled in the user-interface.
There were numerous changes to the underlying program, including: renaming to Superbase NG Personal, selecting the default working directory to be the c:\users\public\documents\SBNG Personal
folder (on Windows), migrating the INI file to the new folder location which is c:\users\<username>\Documents\SBNG Personal
(on Windows) and renaming it to sbngpersonal.ini
. We added dataview
support (Field List) to the copy to clipboard functionality. An important adjustment was made to the defer()
mechanism. We made some enhancements to the Table Status functionality including output of the field and index counts.
We now support four most-recently used (MRU) lists: tables, display forms, print forms, and graphic reports. We added the graphic report support, including loading, running, and creating or modifying them. In the Form Designer we added support for removing a detail block by setting either the rows or columns count to zero. The new Graphic Report Designer is part of the designers package and integrated so that from any designer, the Display and Print Form as well as the Graphic Report Designer are available. We changed the Form Designer package to support three MRU lists, one for each type of form: display, print, graphic report. Made numerous fixes throughout to ensure everything plays together smoothly. Selecting an item in the various form designer modes now shows the traits of that item in the tool bar (font, font size, font attributes, alignment, colors, etc.) if they have them. This does not change the global state. Clicking on the back drop will restore the default values in the tool bar. This change to the tool bar ribbon is not done if multiple controls are selected. Form Designer(s) now show the bullseye cursor when you are expected to click on something, for instance when aligning or sizing objects. We fixed a problem where the background color values were not being read out when opening the dialog to edit a dataform1bitmap
object. The Edit->Paste
functionality now checks that the type of form being pasted matches the type being worked on. Changed the createnewpage()
function in the Form Designer so that for print forms it takes into account the orientation (portrait or landscape) in the page set-up information. We also fixed a problem where if a font is being added to the combo box in the tool ribbon, and it happens to be being added to the end, that it would cause a number out of range error. We made the createblankprintform()
and createblankgraphicreport()
functions in the Form Designer sensitive to orientation (portrait or landscape).
We implemented support for the Update functionality.
The default for opening tables when one is open was changed to opening in the same window instead of a new window and we added the new filtergui.sml
library for list selection in place of the old filter functionality and it is called using the equals (=) button on the selection panel tool bar. The export data code was improved so that if the user types in a name that has no file extension, then the appropriate one will automatically be added. Also, if no path is included, the current path will be added. Finally, after the export completes, a message box will be shown telling how many records were exported, and to which file. The Label Designer now has the Ctrl+A
accelerator for selecting all elements on a form page.
Conclusion
Try things out. Explore. Most important, have fun! Any problems you hit should be discussed in the appropriate news group at news://news.simpol.com/simpol.*.
Neil Robinson
Technical Director
Superbase Software Limited