Addendum for Release 2.0 of the Object Engine.

The Object Engine is an encapsulation of the functions found in Borland's
Paradox Engine.  Note that you MUST have and link with the Paradox Engine
product for the Object Engine to be any use to you!

This release marks the first SHAREWARE version of the Object Engine.  I have
gotten very good response to the software and, after the most recent work,
feel that it is now mature enough to be worth a few nickels.  Please see
the manual.txt and register.txt files.

New in this release:

Network/Locking functions!
1) NO MORE OELists: See below...
2) The SET/GET functions for the class variables are now OPTIONAL.
3) Character dates (i.e. "11/29/59") in addition to struct tm dates (toggle).
4) Support for Inmark's zApp library under windows!
5) The objectID can now be moved anywhere in your database order - this 
        means you can have an automatically generated unique value as your
        primary key if you want it!!  Otherwise, just keep it last and don't
        think about it.
6) Can now DELETE classes in the Gen2 program.
7) Retrieval of "CLOSESTMATCH" records (thanks for suggestion to Mike Sagner).
8) Better Windows/DOS commonality: the objeng constructor is now the same for
        both Windows and DOS.
9) WIN.INI checking and updating: the object engine doesn't just crash your
        program if you ask for more resources than are found in WIN.INI
        (like the Paradox Engine does). Instead, it checks and changes 
        WIN.INI where necessary before initializing the Engine.
10) Support for both Borland C++ and MS Visual C++

And, of course, Bug fixes...


                             ***IMPORTANT***

When Gen2 generates code for you, a global "objeng" pointer variable 
is placed at the top of the generated file.  It is up to you to include an
"extern" pointer to objeng in your "main" cpp file and to initialize objeng
in your winmain() or main() function.  


----------------------------------
Why have the OELists been removed?

The original idea was to provide direct (non-relational)
links between persistant objects.  The complexity in maintaining these links
in a network environment (or even a non-network environment!) coupled with
feedback about the importance of relational links for 3rd-party tools led 
me to eliminate the OEList.

-------------------------------------------
Why are the Get/Set Functions now optional?

In previous versions, you could only gain access to a persistant object's
variables using Set<var> and Get<var> functions.  This was done to
support a full encapsulation of the persistant classes.  However, you
now have a choice with version 2.01.  From the FILE pull-down menu, you
can toggle the "Generate Set/Get Encapsulation" selection to specify
whether you want the Get/Set functions generated.

While not using these encapsulation functions detracts from the C++ "purity" 
of the library, the fact is that these classes exist for data i/o and not 
for in-class processing per se.  In my own work, it has proven wise to 
remove this level of indirection.  However, I can imagine situations where
you don't want the actual database value but rather something derived from
it.  So, I have left leave the choice up to you.

---------------------
What is zApp Support?

zApp is an Application Framework from Inmark Development, Inc.  I don't 
do Windows without it and I recommend it highly.  If you are also a zApp
user, toggle the "Generate zApp Code" selection on the FILE menu.  This
will cause the code generator to output zString classes for all text types.
zStrings are a string class and are more useful and safer than char pointers.

------------------------------
What are character date types?

The final toggle is for character date types.  Use this if you want to 
maintain strings (or zStrings) for the date rather than struct tm* 
structures.  I have found this useful when working with my interface code.

------------------------------
Initializing the Object Engine

Important! you must create (via new) the objeng object before declaring 
ANY instances of any persistant class.  As shown in the sample files, it 
is best to do this on the first line of your main() routine (again...BEFORE 
any static persistant class declarations). New to this release- you now
can initialize the engine with network settings. In fact these are the
only parameters you can set.  The number of tables, cache size, etc. are all
now set in the ObjEng constructor code (since you only set this once
anyway).  Of course, this also makes the source code more valuable...


---------
Compiling

I have compiled and run the sample application using Borland C++ 3.1 and
MSVC++.  Run the SAMPLE.EXE self-extracting archive to see samples of the
compilation settings for BorlandC and MSVC.

Under DOS
You can see the BorlandC DOS switches I use in the MAKEFILE. To run this,
verify that all of the directories are appropriate and then type MAKE. It
will create an executable called TEST.EXE.  The MSVCOE.MAK file is a project 
file for the MSVC IDE.  It creates a DOS executable called MSVCOE.EXE that
performs the same actions as the Borland-created TEST.EXE.  Again, check
that the directories are appropriate before proceeding.

Under Windows
I also use the library in a Windows application I am writing. The Windows 
switches I use are:

-ml -O2 -2 -ff- -Ob -d -WE -V -H=<SYMFILENAME> -w-par -weas -wpre
-IC:\BORLANDC\INCLUDE;C:\ZAPP;C:\PXENG30
-LC:\BORLANDC\LIB;C:\ZAPP\LIB

Some of the warning -off- switches are for the zApp library.  Note that I
have not compiled a Windows exe using MSVC.  If you have any trouble doing
this (I don't expect you will), then contact me and I'll take care of it
for you.

-----------------
As always, if you find a bug, please let me know.

                                                Mark Brittingham

