Introduction
Automatic Project Management for Clarion
Multi-Proj is a comprehensive tool for the rapid creation, maintenance,
and use of DLLs in Clarion for Windows.
If you have any of the following situations then you are a candidate for
Multi-Proj
- Your product uses multiple app files
- You want to easily create DLL function libraries
- You want to wrap your DLL's up into templates, but you don't want to
learn the template language.
- You want an easy way to make sure all necessary files are copied
before distribution.
- You want to be able to generate, and compile multiple applications
in a single pass
- You want to work with files that contain debug code, but distribute
lean, debug free, programs.
- You want to create a multiple program sets which use alternate File
Drivers to the one in the Dictionary.
When your program grows large, there comes a point when you start to
consider breaking it up into many app files, that create DLL's. This
process can lead to quite a bit more overhead, functions have to be
prototyped, procedures need to be exported, and so on. Multi-Proj has been
designed to automate as much of this Multi-App-Management as possible. It
also allows you finer control over how each application interacts with the
others.
Another popular use for Multi-Proj, even if you only have one app file, is
the ability to create versions that substitute a different driver than the
one specified in the dictionary. This means, for example, that migrating
from one driver to another is much easier with Multi-Proj especially if
you need to maintain support for both drivers.
It should be noted that this is a developer-level tool. In other words it
gives you, the developer, more power, and more flexibility than before.
The cost of this power is knowledge. When you know what you're doing,
Multi-Proj is on you side. When you don't know what you're doing then it
can cause you grief. Please take the time to work through the
tutorial.
Multi-Proj continually maintains all the related files, including the EXP
files, PRJ/CWPROJ files, distribution commands, and maintenance of the
template file - automatically. Now changing a DLL becomes as simple as
compiling a single batch. All of the rest of the work is taken care of.
Another thing we regularly do now, is compile all our APPs during the
development cycle with Full Debugging turned on. However Multi-Proj
generates Debug Free PRJ/CWPROJ files for us, which we compile just before
distribution (with the Multi-Proj Manager - a Batch Compiler). Thus our
clients get the leanest code possible - while we can make full use of
Clarion's native debug facilities.
Support
CapeSoft Support |
Email |
|
Telephone |
+27 87 828 0123
(087) 828 0123 |
How does it work?
Multi-Proj consists of 2 parts. Firstly it is an
extension template that is added to the global area of your application.
This template stores all the various project settings that are required to
build the various versions of your APP. When your application is compiled
a project for each version is created. A Batch file (.bat) is also created
for each version, which contains all the necessary distribution commands.
Note: This next part can be ignored for Clarion
7 (or later) users
The second part of Multi-Proj is the Multi-Proj Manager (MPM) . This is a
separate utility which is able to drive the Clarion IDE (Find it in your
Start | All Programs | Clarion 6 Accessories | MultiProj | Multi-Proj
Manager). This is where you can group APPs and PRJs together to form
Batches. Actually I should say that MPM groups them together for you -
part of what the Extension does is link all the dependencies together - so
adding just 1 PRJ file to your batch will add all the other PRJ and APP
files that are required.
- TIP : Many people ask us if they
can use the Batch Compiler without adding the extension. For various
technical reasons, we don't recommend this. There are several freeware
batch compilers available on the web for simple batch compiling. The
Multi-Proj Manager Batch Compiler is optimized to assume you are using
the Multi-Proj template.
If the application is a DLL a template to use the DLL is automatically
written for you. The template contains a global extension which will
activate the DLL in another application. This activation includes
prototyping all the functions exported by the DLL, and including the DLL
in the new application's Project settings. A code template for each
exported function is also included to simplify calling the functions.
To truly understand all the goodies that Multi-Proj offer, it is useful to
understand how DLLs are normally created, maintained, and used, in
Clarion. Doing things the hard way is the easiest way to see how
Multi-Proj makes it easier. Of course you can skip all the pain and simply
do it the easy way. If you want to dive right in, then a good place to go
from here is the
Tutorial. This walks you
through all the steps of turning a single APP into a Multi-DLL product. It
also shows you how to add Multi-Proj to a Multi-DLL product.
Multi-Proj Global Extension Options
General Tab
Project File Name : This is the name of the
overall project containing all the separate versions. This is typically
the same name as the APP.
Export File Structures : Exports file structures
so they can be used in other APPs using this DLL. Note that all the usual
Clarion settings and overrides still apply as they did before. (i.e.
Generate All File Declarations, Export All File Declarations, Individual
File Overrides etc).
Export Your Global Data : This exports the data
variables, contained in the Global Data area (i.e. the Data button) so
they can be used in other APPs using this DLL. It is recommended that you
only export data from your data DLL, however you can export data from any
other DLLs if you want to.
Export Template Global Data : The Clarion
templates typically generate 3 global variables (GlobalRequest,
GlobalResponse and VCRRequest) which are not visible in the Global Data
area. These must only be exported by 1 DLL in your product - although more
than 1 DLL can export YOUR global data. This should be set in your data
DLL and not in any other DLLs.
Export ABC library : If your APP is based on the
ABC library classes, then at least 1 DLL in your product (typically the
Root DLL) needs to 'export' the ABC library. All the other DLLs and EXEs
set the normal Clarion option "Generate Template Globals and ABCs as
External"
Export Procedures in Module Order : When making
a DLL it is important to always export the procedures in the same order.
This makes your DLL more compatible with programs compiled with a previous
version of your DLL. If you are adding Multi-Proj to an existing APP then
this is one way to force the order of the procedures. For more information
on compatibility see the section entitled
DLL
Backward Compatibility later in this document.
This APP has no _RD and _RU Files : This is for
Legacy Template APPs only. Click this option on if this APP uses no
Dictionary File Structures.
This APP has no _SF module : This module is
usually generated by the Clarion Legacy Templates. However in some APPs it
is not included. If your APP does not generate a _SF module then click
this on.
This APP has no BC modules : This is for ABC
Template APPs only. Click this option on if the APP has no BC modules.
Typically the data dll will have BC modules, whereas the other apps will
not. If you get this option wrong (by ticking it on when you shouldn't)
you will experience problem P1 as documented in the
Multi-Proj
Trouble-Shooting Guide.
Highest BC Number : This is only for ABC, and
only needs to be filled in in the Data DLL. The template will generate a
number of modules named xxxxxBC0.CLW, xxxxxBC1.CLW and so on. The exact
number of modules is dependent on your dictionary, and very hard to
predict reliably, so Multi-Proj needs you to fill in the number here. Note
this can change as your dictionary grows. If you get this number wrong you
will experience problem P2 as documented in the
Multi-Proj
Trouble-Shooting Guide.
Tip : Clarion counts them up from 0, to
9, then starts from A. You enter either the highest number, or if there
are letters, then the highest letter.
Export OW Classes : This is for apps that have
the Object Writer template included. If this item is ticked then the
Object Writer classes will be exported, regardless of the EXPORT setting
for these classes. If this option is not ticked then the classes will not
be exported, again regardless of the EXPORT setting for those classes.
Only Export OW classes : If this option is
ticked then only the class will be exported from the app. Use this option
if you are making a DLL, which contains a class, but nothing else.
Suppress ABC Init : This suppresses the
generation of all the ABC init code. Use this if your Object Writer class
does not depend on any ABC classes.
This is app number : When making DLL's
Multi-Proj supports a technique called Rebasing. This makes your apps load
faster, and they're generally more "Windows friendly". This only applies
to DLL's, Exe's and Lib's do not need to be rebased. For a detailed
discussion about rebasing see
ClarionMag
). While figuring out all the various rebasing numbers can be confusing,
Multi-Proj tries to simplify it for you. Here's how it works;
Each DLL in your application has a "Big Picture" number. It doesn't really
matter what the number is, but it's best to simply start with 1 and move
upwards from there. So the Allfiles app will be app number 1, then Procs
DLL will be app number 2 and so on.
Each number is good for 1 meg of virtual memory. If your DLL is more than
a meg big then skip a number in the next dll. So if this data DLL was say
1.1 megs in size, then the Proces DLL would be app number 3.
Note for debugging: Leave the number set
for the size of the non debug DLL's (i.e. compile the DLLs with DebugMode
turned off to get the size you need to use). The extra size on the disk
(when you compile with debugging turned on) is not loaded by windows. It
is only used by debuggers, and analysis tools (like GPF Reporter and
Profiler.)
Versions Tab
Versions : Click on this button to set up each
version. If you are creating a multi-driver suite of apps, then each
driver will need it's own Version.
Each Version has the following settings;
Title : This is the title on the list of
versions. This title is only used for display purposes. A typical title
might be "32-bit Stand-Alone, Debug Off, Version".
Set : If you are making a multi-dll,
multi-driver, suite then you need to specify the SET that each version
belongs to. Each different driver needs it's own SET name. For example, if
you have a set of apps using the Topspeed driver, and this version uses
the Topspeed driver then use a set name like TOPSPEED. It doesn't matter
what the set name is (it could be TPS) so long as all the APPS in the
suite use the same SET names.
Target Type : This is the target type of the
version. Choose from EXE, LIB and DLL.
Target OS : This sets whether the version is 16
or 32-bit. (note 16 bit is retained for backward compatibility, but
Multi-Proj no longer actively supports 16 bit programs).
Runtime Library : Set this to "Stand Alone" for
compatibility with applications compiled with DLLs. Set this to "Local"
for compatibility with applications compiled into a single EXE.
Debugging : Set this to On or Off.
Target Name : Enter the name of this version of
the project. A CWPROJ (Clarion 7 or later) or PRJ (Clarion 6 and earlier)
file along with an EXP and BAT file with this name will be created. Also a
EXE, DLL and/or LIB file will be made with this name. Each version thus
needs a different target name, and all the target names must be different
to the
Project File Name (as set above on the
general tab). If you are compiling EXE's then each version needs to have a
different name, although they can be renamed in the "Distribution"
settings. For more information on naming standards and strategies see the
section entitled
DLL Naming
Strategies later in this document.
Project Name : If the Project needs to have a
different name to the target name then you can enter the Project name
here. This is most often used when you are creating different versions of
the same DLL, and the DLL's have the same (target) name. In the case of a
DLL (unlike an Exe) renaming after the fact doesn't work well. But each
version still needs a unique Project name, so you can enter that here.
Suppress this version for now : If you no longer
want to generate a specific version, then tick this option on.
Driver Substitution to use: Pick the driver substitution
from the list of possibilities if you would like MultiProj to
automatically configure this version for driver substitution. This will
mean that the correct file driver will be added to the project, as well as
the project define.
Resources : Add specific resources here which
apply to this version. This would typically include other 3rd party
libraries. Note that it is now possible for 3rd party products to
integrate directly with Multi-Proj - saving you this step. For more
information see the section entitled
3rd
Party Support for Multi-Proj later in this document.
File Drivers : This lets you override the File
Drivers that will be linked into this Version of the project. This is
typically used when you're making use of the Driver Substitution
facilities in Multi-Proj. (For more information on
Driver
Substitution read the Section below). If you add
any
drivers here, then you must add
all the drivers here. None of
the detected drivers, or drivers set on the All Versions Resources Tab
will be included.
Defines : Add specific project defines here.
This is typically used when you want to do conditional compiles. For more
information on conditional compiles see the section entitled
Conditional
Compiles.
Distribution : This section allows you to copy
files (for this particular version) from one place to another. Typically
you might want to copy DLL, EXE or LIB files.
Resources Tab
File Drivers : Multi-Proj should detect all the
file drivers used by the project. If it misses one (or more) out then you
can enter them here. Enter the Driver name, not the library name (e.g.
TOPSPEED for Topspeed driver etc.)
Force : If you are generating the Prj in one
version of Clarion, but planning to actually compile it in another, then
set the actual compile version of Clarion here. This makes sure that the
correct file driver libraries are inserted ready for compiling. This
feature is mostly used by Clarion 3rd Party suppliers to compile their
DLL's in various Clarion versions.
Common Resources : These are resources that will
be used by all the versions of your APP. These are typically graphic
files, like ICOs, BMPs or GIFs.
External Source : This is for external source
files that may be used in your application. For example if you make use of
the resize support in Clarion 2 then you will need to add the
ResCode.Clw
file here. To see what other external sources your application uses, check
out the
External Source Section of your APPs Project settings.
Enable Override Drivers : Turn this on if you
want to enable the Override Driver support. For more information on
overriding drivers see
Driver
Substitution later in this document.
OverrideDriverPossibilites : This allows you to
create one, or more, Driver override Possibilities. Note this is not doing
the overriding - merely creating the possibility of an override. For each
possibility you need to set;
- Conditional Define : An equate to base the
substitution on. This equate can be anything, but must be unique in
your application. For example UseMsSqlDriver
- From Driver : Such as TOPSPEED
- To Driver : Such as MSSQL
- Max field name length : Some versions of
SQL limit the length of a field name. If you encounter such a driver
then enter the maximum length here.
- Create variable for Table Name : If this is on then
a variable for the table name will be generated for you.
- Name Prefix : This is the prefix added to
the front of all the table names. It depends on your database. For
MsSql a good one to try is dbo. (remember to include the .)
- The alternative to this is to check the Create Variable for
Table Name. This will work well with FM3 if FM3 manages
your table conversions.
- Field Name Case : when constructing the external
name for each field, and key, force the case of the name to this
value. This applies to fields in the dictionary that do not already
have external names set.
- Existing
EXTERNAL NAME Attribute Case : For the fields which do have
external names set, this forces the case of those external names to a
specific value.
- Owner : (Only necessary in the data DLL)
enter the variable here that contains the owner string for the
database.
- Send : Add any Send string commands here
that you might want to add. For example when using MsSql it's common
to use /ZEROISNULL=FALSE
- Add Create Attribute: Check this if FM3 is managing
your conversion and you don't want to check the create attribute in
your dictionary, as FM3 will need the create attribute added to the
table in order to create the table in the database.
- Call connect procedure (FM3): Check this if you
would this conversion requires the SQL_Connect procedure (for FM3
managed databases).
- Do not generate External Field Names : If this is
on then External names for each field will not be automatically
generated.
- Auto Detect DATE/Time Pairs :
- Make all keys Case Sensitive : Removes the NOCASE
attribute from all keys in all tables.
- Generate Overs for Arrays (SQL) :
- Make Auto Number : Choose between Dictionary,
Client Side and Server Side. If set as Server Side then all keys set
in the dictionary as AutoNumber will have AutoNumbering removed.
Template Tab
Template Set Name : If this DLL is to be part of
a larger Template SET then enter the template set name here. This is
normally used when this is not a generic DLL, but rather a DLL specific to
an application. By creating one SET for all the specific product related
DLLs, the templates are grouped better in the template registry. This name
would probably be the name of the product. If you are creating a generic
DLL which will be used in many different APPs then leave this name blank.
NB - you will need to register this
template after it's generated the first time.
Template File Name : This name is typically the
same name as the APP file itself. If this DLL is not part of a Template
SET then this file should have the extension TPL. If it is part of a
bigger SET then it should have a .TPW extension. This template will
include a Global Extension Template (for activating this DLL in other
APPs) and a code template for each Exported Function in the template.
Note that if this APP is an EXE then it
makes no sense to have a Template - so leave this entry blank in that
case.
Don't Generate Code Templates : Click this on to
only generate the Global Extension, and not the Code templates. You would
typically do this if you are creating the Code Templates yourself (stored
in some other TPW file in the same SET).
Includes : If you are wise enough to add your
own, hand-written template files to this template set, then add a list of
your own TPW files here.
Don't generate Dependency defines : Part of what
Multi-Proj does is generate special defines into the generated PRJ's so
that the Multi-Proj Manager can figure out which apps are dependent on
which other apps. If you wish to suppress this feature then you can tick
this option on. This option is ignored in Clarion 7 and later.
Advanced Tab
MsSql : Real becomes Sreal: Tick this option on
if you are using driver substitution, to MsSql, and you are not using FM3.
This option automatically converts any REAL fields in your dict, into
SREAL fields when generating the MsSql file declaration. It needs to do
this because Clarion does not correctly convert REALS to FLOATS when the
file is created. (If you are using FM3 then you can leave this switch off,
as FM3 creates the table correctly.)
Bulk Generating and Compiling (Clarion 7 and later)
The Clarion 7 (and later) IDE contains a built-in
batch compiler. Indeed all compiles are really batch compiles, it's just
that in most cases the batch contains a single app file.
The name for a "batch" In the IDE is a "solution". A solution is thus a
collection of one, or more, CWPROJ files. Since Multi-Proj generates lots
of CWPROJ files for you, it is trivial for you to create a new solution,
containing any number of these CWPROJ files.
Once you have created a solution you can easily open it, and compile it,
thus compiling all the CWPRJ files that it contains.
Using a Multi-Proj DLL in another application
Because Multi-Proj writes a template for you, it's
quite easy to use the functions exported from your DLL in your other APPs.
- When you first write a new DLL, you'll have to register
the new template that Multi-Proj makes for you. Actually if the new
template is part of a Template Set then the Set has to be registered.
Once the Set has been registered it does not need to be re-registered
every time you add a new DLL to it. This is one of the advantages of
using Template Sets.
The name of the Template Set is what you set on the Template tab of
the Multi-Proj extension. Or if there is no Template Set entered
there, then use the Template File Name. (If there's also no Template
File Name then there's no template!) You only need to register the
template once - when you change your DLL the Template, and the
Template Registry are updated automatically.
To register a template go to the Setup menu
(in the Clarion IDE) , to Template Registry
option and click on the Register button.
- The first time you use the DLL in another application, go to the Global Extensions area. Then include the Activate_XXX global extension template. (XXX is
the name of your library). This extension adds the DLL to your current
APP, and prototypes all the exported functions, and data, for you.
If you are building a multi-driver system then you will need to set
the Driver Set that the app will belong to. In other words when you
compile the application itself, which driver do you want it to use.
The template will offer you a drop-down of the various sets that are
available for the DLL you are activating.
- When ever you want to use one of the functions in the DLL, then you
can either go to an embed point, and type the call in there, or you
can make use of one of the Code templates that Multi-Proj generated
for you. There is a code template for each generated function which
will prompt you with the parameters required, and the syntax for the
function.
External Functions in the Application
Tree
It's often useful to have some of your External
functions present on the Tree in the IDE. Clarion does this for you when
you use one of the template ways of one procedure calling another. For
example if you call a procedure, using the template, from a Frame or Menu,
then that procedure appears, as a To-Do, under the Frame in the
application tree.
When you're dealing with multiple DLL's you would usually go ahead and
define the procedure as being an ExternalDLL - and create a module, in
your Tree, for the DLL. However there is a problem with this approach. If
you do it this way, the name of the DLL is entrenched in the APP file.
This may seem like a good thing, but it's not. It makes it impossible to
create different versions of this App (which might use different versions
of that DLL) in a smooth and easy manner.
One way (and the way used in earlier Multi-Proj versions) was to simply
not allow Procedures to be created in this way. There is however a simple
work-around which lets you have your cake, and eat it.
Multi-Proj includes two simple templates which essentially allow
procedures to be defined as Externals and be visible in the tree, and yet
not complicate our multiple version approach. It's a bit of kludge, but
hey, it works.
Firstly create the External Module - using not one of the regular external
modules, but the one offered by the Multi-Proj template. ( i.e. Open the
App, Application menu, Insert Module, and select the Multi-Proj External
Module.) This Module MUST be called External.Ico
and you must make the Map Include file set to Empty.Clw
. Then you can click on each To-Do in turn, and make the Multi-Proj
External Procedures. As you do this make sure the Module name is
External.Ico - select it from the list if necessary.
But hold on - you say - What's this about an Icon. Well the truth is,
External.Ico (in your Tree) is NOT an icon. It's simply a convenient name
which the IDE is happy with. It's necessary to go with the strange name to
fool the Linker a bit later on. Unfortunately in this case the IDE is too
smart, and insists on adding whatever name we use to the Project ( the one
built into your application). Usually at this point it would be a LIB file
- which is what we're trying to avoid. By using the name of an Icon (
which does actually exist - it's shipped with Multi-Proj) - the linker is
happy.
The reason we use the Empty.Clw statement in the Map is because all of
these procedures are going to be prototyped by their respective Multi-Proj
generated templates. If we let Clarion do it's normal thing we'd get an
'Indistinguishable Prototype' error. So again to override Clarion's
cleverness we use this simple override.
Tips
- If you are creating a DLL / Lib combination then set the APP itself
to be a DLL. Then click the Export Function
switch for those procedures you want to export.
- If your program gets link errors when trying to compile the project,
but the application itself compiles ok, then check the "Project"
settings of the APP. Most likely you have omitted a resource in either
your Version Resources, or Common
Resources.
- If you want maximum value from the Code template then use the long
form of prototyping when you prototype your functions in the DLL. The
prototype for the procedure is set on the Procedure
properties window. Normally you only put the parameter types
in the Prototype e.g. (LONG, LONG, STRING)
. However you can also put the variable names here. For example (LONG
FromDate, LONG ToDate, STRING Holiday)
- If you are using FM3, and you are using Multi-Proj to create
multiple driver versions of your app, then you need to handle the fact
that each driver version of your file represents a different file
version number (as far as FM3 is concerned). To do this;
in your data dll
global embed point, called "program setup"
priority 10
put
compile('***',MsSQLDriver=1)
ds_VersionModifier = 1000
***
if you had a third driver, say oracle, then you'd also add
compile('***',OracleDriver=1)
ds_VersionModifier = 2000
***
and so on.
- If you are struggling to use the Multi-Proj Manager, because of DDE
problems, then try making a shortcut to the Mp.Exe on your desktop.
Running it from here, rather than from inside the IDE (Accessories
menu) seems to work better on some machines.
- If you have a lot of icons in your application, you should export
your txa and add the icons to the MultiProj Common Resource list using
copy and paste. You can then re-import the txa with the icons in the
list.
List of Errors
Compile and Link Errors
Make error: File "<filename>.exp" not
found: The target type in the Multi-Proj Global Extension does
not match the target type in the Project Properties. If you are building a
DLL make sure they are both set to DLL. If you are using Clarion 5.5
legacy, then you need to modify the buildexp.tpw to add an embed point as
follows (right at the end of the file):
#EMBED(%AfterClosingExports,'After Closing the
export file')
Execute of <filename>.DLL failed, File
not found: Make sure in the Project Properties, that you haven't
put the Target Name in the Programs to Execute section by mistake.
Link Error: Unresolved External NetDUNRename (and about
90 others): This is caused if this Application is a Data DLL,
and NetTalk is installed on your system, and neither the Activate, nor
Suppress NetTalk extensions are in this app. If you intend to use NetTalk
then add the Activate NetTalk Global Extension to the application,
otherwise add the Suppress NetTalk Global Extension.
Link Error: Unresolved External <$CUSTOMER> in
<filename>.obj: This may happen if you have not included
all the Global Templates for all the DLL's in your project. You should
have a Global Template for each DLL that this application is dependent on,
plus your template set name Global Template. (If this occurred when you
were doing the tutorial and you had not done the first part of the
tutorial, then you probably chose to Generate All, instead of the 'Just
This File' Generate option. If you are not working through the whole
tutorial and are just doing the Multi-Proj Manager tutorial, then
re-install Multi-Proj to restore the original tutorial files.
Link Error: Unresolved External ~<iconfilename>
in <filename>.obj: This will happen if you've put the tilde
character in front of icon files in your browse icons tab. You need to
remove the tilde characters from the front of the icon filenames that you
have used in your browse icons. These are icons are included in your
project and the icon used will be the one included in the project. Only
icons used in handcode require a tilde to use the icon included in the
poject.
Syntax error: Indistinguishable new prototype:
<procedure name>: You may have declared your procedure to
be an ABC External type when it should be a Multi-Proj ExternalProcedure.
Link Error: Unresolved External: Possible
causes:
- If you are using 3rdparty products that are adding items to your
Application's project and are not MultiProj compatible, then they will
be not be informing Multi-Proj about those LIBs.
- You have not informed MultiProj what the highest BC module is (that
is generated by your application).
- There are some file drivers/external resources that have been added
manually to your app's project, that MultiProj does not know about,
and is not adding to the Project.
- You have added a function to one of your DLLs, but the IDE is not
automatically updating your template chain. (See the FAQs
on overcoming this issue)
- You have a function with the PASCAL attribute, but you have not
specified a NAME attribute to the function (in the function
prototype).
How to resolve this:
- Open your application in the IDE and select the Export Project
File item from the File menu - and select a unique
project name.
- Open your Project (that you've just exported) - and compare it to
the Project that MultiProj generates (this is the name of the
Project/Target that you entered on the Versions tab of your MultiProj
template instance in your application). You can open the projects in a
text editor (like NotePad or the Clarion IDE).
- First check the LIB files that are added to the App's Project and
see if there are any of them missing from the MultiProj Project. If
there are, the best solution is to contact the 3rdparty vendor - and
inform them that there product is not compatible with MultiProj. This
is very easy to do, and can be done using the 3rd
Party support for Multi-Proj section of this document. If your
lib file needs to be added to the Multi-Proj project manually, you can
do this in the Common Resources button on the Resources
tab of your Multi-Proj template:
- Next check for any missing clw files. These could be additional BC
modules, which MultiProj does not know about. Find the highest BC
module number (this is in Hex):
(In this case it's B)
and enter it into the MultiProj template:
- Other missing CLW files can be added to your External Source
list on the Resources tab of the MultiProj template.
$VCRRequest is unresolved
for Export: This should only happen in old version of Clarion 2,
before this variable was introduced. To fix this error, go to the Global
Embeds, in the "Global Data" embed point add
VCRRequest long
Missing Global Variable Declaration:
GLO:<Filename>_Name: You are using Driver Substitution and
FM3, but you have not checked the "Create global variables for file names"
in the Multi-Proj global extension template.
You have not allocated a unique template name in the
Template
tab of the Multiproj Template.
My Compiler GPFs since breaking my app into DLLs.
- Are the first 5 letters of _every_ app unique? We've seen problems
where the first 5 are common and this leads to generated source from
one app ending up in another.
- Because MultiProj creates a code template for each function of the
DLLs (this used to be on by default, but is now off by default for
this reason) it manages - your template registry can get to a size
that Clarion cannot manage. Uncheck the "Don't Generate Code
Templates" checkbox, and then regenerate all your applications. Delete
your registry.trf file (located in the clarion\template directory) and
then re-register your templates (see www.capesoft.com\accessories\downloadFAQs.htm#FAQB5
for details).
- Does it GPF at the same place? i.e. could it be code related? We've
seen "bad" code sometimes GPF the compiler.
- Clean out obj32 and obj32\release from time to time, that can help
if you got a bad obj file.
- After a gpf go to the windows task manager and remove any process
called NTVDM or C6*
I get "Too many #Pragma defines" error message
On the "Template" tab of your Multi-Proj extension template, turn on the
'Don''t generate "Dependency" defines' switch.
<MemoField> Is unresolved for export
Your project is trying to export a MEMO field (declared as such in the
dct) - but has been converted to a CSTRING (or STRING) in the project. In
that project version (MultiProj template) uncheck the "Export Memos"
checkbox located on the File Drivers tab.
Driver Substitution
Driver Substitution (DS) is a Multi-Proj Advanced
Feature and may not be relevant to your situation. DS is useful however if
you are changing from one Driver to another - or you wish to support
multiple drivers in your application. For example if you have an existing
application using the TOPSPEED driver, but you wish to also have an MSSQL
version, then Multi-Proj will allow you to do this.
One point to note here however is that Multi-Proj does not optimize your
code at all for the drivers. There are some differences, internally,
between ISAM (Flat File) drivers like TOPSPEED and SQL drivers like MSSQL.
In time you may want to optimize parts of your code for the actual driver.
At this stage Multi-Proj merely performs the driver substitution. It is
however possible (using Conditional Compiles) to optimize your code for
both drivers. That will be discussed in a moment.
Note: Before proceeding with implementing
driver substitution, you must make your dictionary SQL compliant (see
https://www.capesoft.com/docs/fm3/fm3sql.htm#Convert). It is highly
recommended that you use FM3 to manage your data conversion, as doing this
manually will be very tedious (
www.capesoft.com/accessories/fm3sp.htm)
The Mechanics
Adding Driver Substitution to your application is a
2 part process.
- First on the Multi-Proj extension, on the Resources Tab, Click Enable Driver Substitution ON. Then click on
the Override Driver Possibilities button.
The idea here is to define which drivers might be
overridden. In our example (of having TOPSPEED and MSSQL versions)
we will override the TOPSPEED driver with MSSQL in some versions,
and in other versions we won't. We'll get to the versions in a
moment - for now we're just defining the possibilities.
With each possibility you'll need to enter a Conditional
Define. This is basically an identifier or an equate.
This equate will be defined for you. When the equate is 1 then the
driver will be substituted, when it's 0 it won't. You'll see how the
equate is set in a moment - for now though it's necessary just to
create the name. For the example I'm going to call it UseMsSql.
You'll also need to set the From and To drivers. If the SQL backend
restricts the number of characters (for example old versions of
MySQL has a 12 character limit) then enter that. In the case of most
SQL backends you'll need to enter a database prefix. For MsSql this
is most likely to be dbo. (including the .) but this does depend on
your database.
In the data DLL you'll also need to enter the Owner (usually a
variable that contains the database connection string) and
optionally a Send string.
- Add Create Attribute - If your
tables are not created in TPS - you may like to add the create
attribute for your SQL project.
- Do no Generate long External Names -
if you have already added an external name to your fields and
keys, then you can turn this off to prevent MultiProj from
tacking an additional name attribute on to the field and key
declaration.
- Auto Detect DATE/TIME pairs - only check this is if you have not
used a GROUP,OVER a STRING(8) in your dictionary for your dates
and you are using a version of SQL (MSSQL <2005) that does
not support individual DATE/TIMEs.
- Make All keys case sensitive - if
your keys don't need to be case-insensitive, then it's a good
idea to check this, as a case-sensitive key is far more
optimized that a case-insensitive key.
- Generate Overs for Arrays - SQL does
not support dimensioned fields (this includes PostgreSQL,
because the Clarion ODBC driver does not support arrays). This
means that you will need to create a group, and place the array
over the group, which Multi-Proj can do for you (as long as you
have not already done this in your dictionary manually).
- Make
Auto-Number - Dictionary | Server-side | Client-side.
This switch will enable you to turn off Client-side
Autonumbering in your SQL project. You will still need to create
the identity field (or tell FM3 to do it for you) in your
dictionary - but this will not affect your flat-file version.
NOTE: If you set this option to Server-Side, in Clarion 7 and
later, a change to the ABC classes is required. The declaration
of the FileKeyQueue structure needs to be moved from the ABFILE.CLW file to the ABFILE.INC
file. these files are in \clarion\libsrc\win.The
structure is;
FileKeyQueue QUEUE,TYPE,PRIVATE !
QUEUE of all keys in a file
Key &KEY ! Reference to a KEY
Description STRING(80) ! Key description text
(from Data dictionary)
Fields &KeyFieldQueue ! Reference to key
components queue
AutoInc BYTE ! Auto-increment flag (from Data
dictionary)
Dups BYTE ! Duplicates allowed flag (from
Data dictionary)
NoCase BYTE ! Case sensitive flag (from Data
dictionary)
END
- General Field conversions - This
allows you to form a list of field types that you want to force to
a specific type on the SQL backend (In conjunction with FM3). IOW
if you want all DATEs to be formed as datetime types on the
backend, you can specify this here.
- Different Owner Files
- this allows you to override the default owner variable for
specific files. This is useful if you want to connect to 2
different databases (for example, for global data). Note: If you
want FM3 to manage both databases, you will need to build an
upgrader application for this separate database, as FM3 can only
manage 1 database per application instance.
- The second part of the process is creating the actual MSSql
version. You do this by creating a Version in the normal way. In the
Driver Substitution droplist, select the driver substitution
possibility that you just created. Then go to the Resources Tab
(still in the same Version) and click on the Other
File Drivers button. Here you'll need to make sure that
your Export Memos is unchecked for SQL
versions.
Note (for FM3 users):
- You must make sure that your project defines in the MultiProj
extension template match those in the FM3 Connect window template
and that your dbOwner variable matches that set in the Override
Driver Substitution options.
Some tips for maintaining multiple projects
You can create conditionally compiled handcode
specific specific to one driver project set. This is typically useful
where you want to setup different filenames for each file driver
supported.
compile('****',MSS_DRV=1)
!MSS_DRV is the Conditional Define you used in the
OverrideDriverPossibilities template prompt.
CustomersFileName = 'dbo.Customers'
!****
omit('****',MSS_DRV=1)
CustomersFileName = 'Customers.tps'
!****
The Internals
If you look in your main module for your App you'll
see that Multi-Proj generates the file structures multiple times - once
for each possible substitution, and once for the actual dictionary set.
However ONLY 1 set of file structures is actually Compiled into
your application. By using Conditional Compiles, and the Conditional
Define, Multi-Proj allows for the different versions of your program.
Multi-Proj may have to change the file structure slightly in order to
accommodate the specifics of each driver. For example Topspeed files
support the MEMO data type - but MSSQL doesn't. So for MSSQL memo fields
are converted to CStrings. In addition some of the File attributes are
not supported by all drivers, so where necessary they are removed (for
example MSSQL doesn't support RECLAIM).
Other Issues
Your file structures needs to contain only data
types which are valid in both drivers. See the Advanced tab for specific
field overrides that Multi-Proj can do for you.
Overriding Driver Substitution for individual files
If you'd like to keep specific data files as a type (not being
influenced by the Driver Substitution), then you can add the following
File UserOption to your dictionary file declaration:
FIXDRIVER <DriverType>
Open your dictionary and right-click on the file that needs to be fixed,
go to the options tab and add a User option as follows:
Note, you must set the Value to what you
want it to be (typically the original FileDriver itself).
Overriding the addition of the NAME attribute (external name) to
fields and keys
To suppress MultiProj from adding the ,NAME('"externalname"') attribute
to fields and keys, Use the File User Option:
NoExternalName = 1
Handling Dynamic Indexes in your Dictionary
The easiest option is to remove the dynamic Index(es) - although this is
not always possible to continue supporting your TPS version. If you
cannot delete the dynamic index, then you need to do the following in
the Key User Options for that particular index:
Basically, MultiProj needs to force a field name into the Index, so that
a non-dynamic index will be created in the SQL project. The above
FieldName option is the name of a field in that table.
Browse Filtering in your app
In your browses, you may have used different keys in filters for the
browse. When using SQL, you need to use the primary key - or
alternatively add the primary key component field to the key that you
are using.
Secwin
Typically you would like your secwin files to exist on the new backend.
This is a simple process to set the new place for the Secwin files (just
check the Make Secwin files on the substituted database checkbox of the
Driver Substitution options), although exporting and importing your data
can be a little more complex. First up, is you need to export your
Secwin data from the previous application (using the ds_ExportTables - a
Secwin function that will export all the secwin data to a binary file).
This needs to be done in the old application, as the secwin file driver
needs to be set correctly. The new application then needs to call the
ds_ImportTables (another Secwin function to import from the binary file
that was exported).
Auto Numbering
Often it's useful to be able to use a AutoNumbered key in the TPS
version of your application, but transfer the autonumbering to the
server-side when compiling the SQL version of the project. This is
reasonably straight forward using Multi-Proj, but requires some changes
in your Clarion environment (since the Clarion templates themselves are
not aware of Multi-Proj). We have submitted a change for SoftVelocity to
attend to, and this should hopefully be included in future versions of
Clarion.
Note: If you are wanting to prime the record (for child browses) you
will need to use the driver options string as specified in the FM3 docs.
Firstly, what you need to change in your Clarion templates:
Open your ABPROGRM.TPW file in a text editor (you can use the source
editor in Clarion) and search for the following line (Clarion 6 users of
9058 and up):
#ERROR('An Identity Column can not belong to an
Auto Number Key (Key:'&%Key&' -
Column:'&%FileIdentityField&')')
#ERROR('Set the Auto Number option to false.')
An Identity Column can not belong to an Auto Number Key (Key:%Key -
Column:%FileIdentityField)
Set the auto Number option to false.
Comment out those lines as follows:
#!ERROR('An Identity Column can not belong to an
Auto Number Key (Key:'&%Key&' -
Column:'&%FileIdentityField&')')
#!ERROR('Set the Auto Number option to false.')
!An Identity Column can not belong to an Auto Number Key (Key:%Key -
Column:%FileIdentityField)
!Set the auto Number option to false.
Do the same to the CW.TPL file.
Secondly, what you need to change in your ABFILE.CLW and ABFILE.INC (at
the time of writing this clarion 6 9059 and below, and clarion 7.1 and
below):
Open your ABFILE.CLW file in a text editor (you can use the source
editor in Clarion) and search for the following line:
RelationQueue QUEUE,type
Cut the complete definitions of the RelationQueue, KeyFieldQueue,
FileKeyQueue, FieldsList, SaveQueue and BufferQueue queues (this should
be around 55 lines of code) and paste those definitions into the
ABFILE.INC
Thirdly, you'll need to setup your DCT for Server-side and client side
autonumbering as follows:
- Leave the auto-numbering on in the Primary Key (you can turn this
off in your MultiProj settings).
- In the autonumbered field, add the following Field
user options (Note: must be field user options):
Fourthly, open your application in the IDE, and go to the MultiProj
template (Global | Extensions | Activate MultiPrj):
On the resources tab, click the Override Driver Possibilities button,
and locate the SQL override that you want to make the numbering
server-side. Click the properties button, and in the Make Auto-Number
drop down list, select the "Server-Side" option.
Generate File
Declarations in Modules
In your application, on the Global Properties, File
Control Tab is an option to Generate File Declarations in Modules. As
from Multi-Proj 3.01 this option is supported, however a manual change
to the shipping templates is required to support this.
Template Change ABC
In ABFILE.TPW circa
line 568 you'll see the following code;
#EMBED(%BeforeFileFileStructRecEnd),%File,HIDE
#IF(%GetFileDeclareMode() = 'FILE')
%FileStructRecEnd
#ENDIF
%[20]NULL %(LEFT(%FileStructEnd))
This needs an extra line added to the bottom to become
#EMBED(%BeforeFileFileStructRecEnd),%File,HIDE
#IF(%GetFileDeclareMode() = 'FILE')
%FileStructRecEnd
#ENDIF
%[20]NULL %(LEFT(%FileStructEnd))
#EMBED(%AfterFileDeclaration,''),%File,HIDE #! MultiProj
A request for this to be added to the shipping templates has been made
(PTSS 43006). Hopefully future versions of Clarion will ship
with this embed point included.
Template Change Clarion (Legacy)
The exact same change as for ABC (described above)
is required in File.TPW circa line 135.
The same code exists there, and the same embed needs to be added.
3rd Party support for Multi-Proj (Clarion
7 and above)
Note - Clarion 7 introduced a new project format, so
developers should implement the instructions below if their template
supports C7 or above. In addition, if supporting C6 and below, see the
previous section.
One of the features in Multi-Proj is the addition of a number of Embed
points. These allow other 3rd party products to interact with Multi-Proj,
which saves you a lot of time and effort. The following section deals with
these features, and is directed primarily at Template Authors. If you do
not write templates then you can safely ignore this section. However if
you're a user of other 3rd party products, and the product is not MP
compatible, then you might want to direct them to this document so they
can add compatibility.
The primary goal of the compatibility features is to reduce the amount of
work required by the User to add resources to the application. In the
template language this is taken care of using the #Project command.
Unfortunately there is no way to Read the contents back from #Project -
and indeed in certain cases this would be insufficient anyway. In order
for you, the Template Writer, to afford the user maximum computability
between your product and Multi-Proj you need to add some extra code in
addition to each of your #Project statements. Lets look at each type of
resource in turn;
Graphics Resources
These are files such as BMP, WMF, GIF, ICO ,CUR and so on. These files are
"version independent" and so are added to a single Embed point - called
%mpRscAll7
If your template has a statement like
#Project('Cool.Ico')
then you need to add the following to your template
#AT(%mpRscAll7)
<Library Include="Cool.Ico" />
#ENDAT
If you have added a File Driver to your project, using say
#FIX(%Driver,'TOPSPEED')
#PROJECT(%DriverLib)
then you need to add the following to your template
#AT(%mpRscAll7)
<FileDriver Include="TOPSPEED" />
#ENDAT
Source Code Resources
These are CLW files which your template might use, but which are not added
to the Application Tree. Your template code might typically look like
this;
#Project('Tag.Clw')
then you need to add the following to your template
#AT(%mpCompileAll7)
<Compile Include="Tag.Clw" />
#ENDAT
Note that the above embed point is used for
Source files which are included
Regardless of the Runtime
Library (i.e. Stand-Alone or Local). There are also embed points which are
only used in specific cases - i.e. if the your external source file is
dependent on the Runtime Library then you can use the following embed
points;
#AT(%mpCompileX7) #! 32-bit DLL
#AT(%mpCompileXL7) #! 32-bit Local
LIB and OBJ Resources
These resources are almost always dependent on the Runtime library of the
program being compiled. Your template code will probably look something
like;
#PROJECT('whatever.lib')
In this case you can use the All embed. The only complication is that each
% character in the code above needs to be expanded to %25 in the code
below. Like this;
#AT(%mpLibAll7)
<Library Include="whatever.lib" />
#ENDAT
There are also two additional embed points if you are directly deciding
between Lib mode and DLL mode. You can use
#AT(%mpLibX7)
<Library Include="C%%25V%%25NET.Lib" />
#ENDAT
for DLL mode and
#AT(%mpLibXL7)
<Library Include="C%%25V%%25NETL.Lib" />
#ENDAT
for Lib mode, respectively. (In the Above examples the CLANET and CLANETL
Libs are being included.
Project Defines
These are template driven defines that are placed in the Project Defines
section. Typically your code might look like this:
#pdefine('MyDefine=>1')
Leave this define as is for non-Multi-Proj users, but for Multi-Proj
users, add the following:
#AT(%mpDefineAll7)
%%3bMyDefine=>1%%3b
#
endat
Notice the leading and trailing
%%3b (which
is a ;) and the encoding of the > sign to
>
Global Data
This is common between Clarion 6 and below, and Clarion and below. See the
details in the Clarion 6 section above.
DLL Backward Compatibility
One topic worth discussing briefly is that of making
sure your DLLs are backwards compatible. What I mean by this is that you
are able to ship a more recent version of your DLL, into an existing
client, without there being any side effects. This is a very powerful
approach because it allows you to distribute bug fixes, and minor updates,
of your product in pieces, rather than requiring a whole new install.
The key to this compatibility issue is the items which are Exported from
the DLL. This can get quite complicated, so I'm going to stick to the
basics here. The items exported are stored in the EXP file. If new stuff
is ONLY added to the bottom of the EXP file, then the DLL will be forwards
compatible. In other words the new DLL will work with programs compiled
earlier.
However, the stuff in the export file is stored by Number, not by Name,
and it is usually listed as first data, then procedures, then classes and
so on. Thus if you add data to the DLL, all the procedures will get a
different number.
For this reason it's a good idea to restrict the exporting of data to the
Data DLL. All the other DLLs should export only Procedures. Then items
added to the DLL will be at the bottom of the EXP file, and the DLLs will
be completely forwards compatible.
Conditional Compiles
In Clarion it is possible to conditionally compile
code, depending on some settings in the CWPROJ/PRJ file. Remember the goal
of Multi-Proj is to allow you to compile multiple versions of the same APP
- from the same source files. This implies that the source files must
contain all the possible flavors of the code. However, of course, only one
flavor must be compiled in any given situation.
For Example : If you are using any Windows API
calls, then in all probability these calls are slightly different in
16-bit and 32-bit. So a 16-bit DLL needs to compile slightly different
code to a 32-bit DLL. this is an example of where using a Conditional
Compile is very useful. To use the GetWindowsDirectory call you would need
to do the following in the Global Map;
Module ('Windows')
COMPILE('***',_WIDTH32_=0)
GetWindowsDirectory(*CSTRING,USHORT),USHORT,PASCAL,RAW,name('GetWindowsDirectory')
***
COMPILE('***',_WIDTH32_=1)
GetWindowsDirectory(*CSTRING,USHORT),USHORT,PASCAL,RAW,name('GetWindowsDirectoryA')
***
End !Module
In the above example we make use of the _Width32_ define (this is a built
in define) to determine if the DLL is compiling in 16 or 32-bits.
This approach is however very useful in other circumstances. For example,
say you wanted to create a debug version of your program, and a non debug
version. Then you could add the following code to your APP;
COMPILE('***',_Debg_=1)
stop('The variable x = ' & x & ' here ')
***
Or you might want to create a message screen for non-registered versions,
like this;
COMPILE('***',_Demo_=1)
Message('Come on! Please send me money!!')
***
One useful tip is that Defines used in this way are automatically assumed
to be 0 if they don't exist. Thus you only have to add them to versions
when they must be set to something other than 0. To add a define to a
version, go to the Multi-Proj extension, go to the specific version, go to
the defines tab, and simply set the Define to 1 there. For example;
_Demo_=>1
Notice the somewhat unusual => sign
(which means equals).
Also remember that _Width32_ is set for you in 32-bit compiles.
If you are doing a multi-driver system and you want to add code for a
specific driver, then you can use the Conditional Define that you created
on the OverRide Driver Possibilities list. For example if you used UseMsSqlDriver
then you can encapsulate some code in a conditional compile. For example;
COMPILE('***',UseMsSqlDriver )
myview{prop:sql} = 'Select * From Customers'
***
This code will then only be executed when the MSSql driver is being used.
DLL Naming Strategies
It is useful to follow a strategy when naming DLLs.
You can use whatever strategy you like - some common strategies are listed
here for your convenience. Obviously your naming strategy will depend on
you specific requirements.
Clarion style
This was introduced with Clarion 7, and is still used with Clarion 8.
CLAaaaL.DLL
- aaa is the name of the DLL, for example RUN for the Runtime library,
TPS for the Topspeed file driver, OLE for the OLE support and so on.
- L is included in the name if the LIB is a Local Mode compile. It is
omitted for Stand-Alone compiles.
Clarion Old style
This was introduced with Clarion 4, and is also used with Clarion 5, 5.5
and 6.
CnaaaXL.DLL
- n is the version of Clarion - 4, 5, 55 or 60
- aaa is the name of the DLL, for example RUN for the Runtime library,
TPS for the Topspeed file driver, OLE for the OLE support and so on.
- X is included in the name if the DLL is 32-bit. it is omitted for
16-bit DLLs
- L is included in the name if the LIB is a Local Mode compile. It is
omitted for Stand-Alone compiles.
Clarion Older style
This is the Style used with Clarion 2.
Ct2aaann.DLL
- t is the Type - W for a Stand-Alone compile, L for a Local compile
- aaa is the name of the DLL
- nn is 16 for 16-bit, and 32 for 32-bit DLLs
FAQs
Copyright and License
Multi-Proj and
Multi-Proj
Manager are copyrighted © 2023 by CapeSoft Software CC. All
rights reserved.
This product, and all the files contained therein, is copyrighted by
CapeSoft Software.
Each developer needs his own license to use Multi-Proj. (Need to
buy more licenses?)
This product is provided as-is. CapeSoft Software and CapeSoft Electronics
(collectively trading as CapeSoft), their employees and dealers explicitly
accept no liability for any loss or damages which may occur from using
this package. Use of this package constitutes agreement with this license.
This package is used entirely at your own risk.
Use of this product implies your acceptance of this, along with the
recognition of the copyright stated above. In no way will CapeSoft , their
employees or affiliates be liable in any way for any damages or business
losses you may incur as a direct or indirect result of using this product.
Templates written by Multi-Proj are your property and can be distributed
as you wish.
Version History
Download latest version
here
3.06
- 2 November 2023
- Change: Generates the Template Name into the description of child
#Extension templates.
3.05 - 12 October 2022
- Change: Do not generate support for Secwin 6, if Secwin 7 is
installed.
3.04 -3 April 2022
- Change: Legacy apps now generate Long File Names if IDE is set to
Long File Names.
3.03 -4 Jan 2022
- Fix: Template error: Redeclaration of %FieldStructTMP in same scope
3.02 - 24 May 2021
3.01 - 5 March 2020
- Add: Support for "Generate File Declarations in Modules". Not that
this support requires an embed point to be added to your shipping
templates. See here.
- Add: "Other Included Files" option added to Resources tab. These
other files will be linked into the project(s).
- Fix: Quotes automatically added around Sendstrings sent to Secwin
tables.
3.00 - 13
Sept 2018
- Add: Clarion 11 to install.
2.99 - 6
Sept 2018
- Add: File User Options for a Table cascade down to Alias's on that
table.
2.98 - 19
July 2017
- Add: Template option
to force the case of existing "External Names" in the Dictionary.
- Fix: Support for Legacy shortname / longname generation for _SF and
_RD files.
2.97 - 7
January 2016
- Fix: Overriding auto-number when doing Driver Substitution applied
to all tables, not just substituted ones.
2.96 Released 19 August 2015
- NoExternalNames file user attribute allows you to override the
generation of the NAME attribute (for fields and keys) for a specific
table.
- Can generate the MPRJ.$$$ temp file into a location other than the
app path.
2.95 Released 25 February 2015
- Clarion 10 support in Installer.
- Allows you to connect to 2
different databases (Driver substitution)
- Additional support for Secwin (you can add the Secwin libraries
manually in case you want to use a file driver other than what
multi-proj selects).
2.94 Released 15 April 2014
- Application icon gets assigned in the cwproj if set in the resources
of the project.
2.93 Released 31 January 2014
2.92 Released 7 October 2013
- Support for Secwin tables for driver distribution. Overrides the
Secwin template settings for the ds_SetOwner and ds_SetPath calls, and
uses the driver substitution settings.
- A Version can be set to use a specific driver substitution. This
replaces the need to set the driver substitution project define for
the version, and add the new file driver.
- New driver substitution option to call the FM3 connect procedure
(requires FM3 5.13 or later).
- For Btrieve substitution - only add .dat filename if the filename is
not a variable.
- Fix for project defines - was not always including the %3b separator
for all project defines.
- Fix - does not repeat filedriver includes in the cwproj creation.
- Fix - Clarion 9 legacy application cwproj generation, was generating
long names for _rd, _ru and _sf files when longnames are set to
generate in the IDE. In legacy, these are generated as concatenated
filenames, even if longnames are selected for the clw generation.
2.91 Released 13 June 2013
- Template option: 'Do not add Batch file to end of compiles' to
global template (so you don't need to check it on each version).
- Clarion7 and up fix: determines if long filenames are used or not
- Cleans out invalid characters in the project and target name (so
that a valid cwproj file can be made).
- Clarion7 and up fix: #embed for %mpDefineX7 and %mpDefineXL7 was not
defined in the template (so other templates using these embed points
did not have their project defines added to those cwproj files).
- Tidied up the generation of project defines into the cwproj file
(no <13,10> and removed duplicate %3b symbol separators).
- Clarion 7 and up - application icon added to the cwproj file.
- Clarion 7 and up - new pre-build event template option to add code
to run before building.
- Clarion 7 and up Template fix - Does not export memos for
non-FixDriver files (where memos are not supported by that file
driver).
2.90 Released 2 May 2013
- Clarion 9 compatible build.
2.89 Released 26 February 2013
- Add: CwProj not generated if version name matches app name (in
Clarion 8)
- Remove: "Procedures" (documentation) tab from generated templates.
Makes the templates larger and it's unlikely this tab is useful.
- Remove: work-around of template deleting cwProj files to force
reconversion from .Prj.
2.88 Released 6 August 2012
- Added support for generating CWPROJ files in Clarion 7/8, rather
than PRJ files.
2.87 Released 20 July 2011
- Fix for C8 for redeclaration of %AlternateOwner and %AlternateFile
error.
2.86 Released 19 May 2011
- Fix for C7 and up. Deletes cwproj files to force regeneration of
them from the .prj files.
- Fix for C7 and up. Run bat file without calling command.com (was
calling in wrong folder).
- Added C8 support.
- Force '()' into proc definition if non-existent in the prototype
(required for C8 support).
- Validate a procedure description for correctly formatted Clarion
string.
2.85 Released 9 November 2010
- Fix for FM3 support for FIXDRIVER table support. Does not generate a
filename equate in the Connect to SQL window.
2.84 Released 14 October 2010
- Driver substitution support: Uses the ds_AlternateFileNameAndOwner
function (rather than the ds_AlternateFileNameEx) so that TPS files
with encryption can be automatically converted to SQL.
- Adds the FieldIcon to the project, only if the '!' does not exist as
the first char.
- Driver substitution support: Adds an additional
ds_AlternateFileNameAndOwner call if the oldname attribute is already
present on the file user options.
2.83 Released 6 October 2010
- Dependancy Defines defaults to '0' - not really required, and just
adds a ton of #pragmas to large multi-dll projects.
- TPL fix - for Date/Time pair detection where 2 Date/Time pairs are
simultaneous in the record declaration.
- TPL fix - when using driver substitution in conjunction with FM3 -
where Date/Time pairs are created, set the RealField/UnRealfield
options for FM3
2.82 Released 21 September 2010
- C7 support - delete the cwproj file so that a new cwproj is
generated from the prj file generated.
- Tweak to export Memos - Clarion7 support.
- Tweak to only set the pdefines in the generated template for the set
that each version belongs to.
- Warn if no %ControlFieldIcon template variable exists.
2.81 Released 29 March 2010
- Can use old naming convention for overs (i.e. no underscores) in
Driver Substitution.
- In Driver Substitution, you can convert all of one dct variable type
to a SQL variable type. The FM3 ForceSQLDataType will override this
setting on a field level.
- Exclude 'icon:' from adding to the resource list.
- Limit Projecting of Drivers to one instance.
- Add InMemory to driver option list.
- Create list of procedures in the generated template that are
exported. This makes it easy for other templates to use this list of
procedures.
- USEPREFIX file user option for driver, allows you to use a different
file prefix for each driver instance of the file in the project set.
- Legacy: If file is a threaded file, then declare the used variable
as a threaded external variable in other dlls.
2.80 Released 19 February 2010
- Included missing Empty.Clw in C7 installs.
2.79 Released 8 July 2009
- Changed NAME in EXP file to LIBRARY to better support C7v6 mode.
2.78 Released 29 May 2009
- Clarion 7 fix (was not including the latest template in the Clarion
7 build).
- Template tweak - exports method names correctly (that include
additional dots) in C5 and C55.
2.77 Released 27 November 2008
- Bug fix in LongFileName support.
2.76 Released 10 November 2008
- Clarion 7 compatible install.
- Template change - TargetName and Set in the Versions list
description.
- Template change - for Driver Substitution, you can select whether
AutoNumber is client side or server side.
- Don't generate code templates checkbox defaults to 1.
- Use full application name (if GenerateLongFileNames is set).
- Template change - don't include a module (that has no name) - and
don't link in a resource with no name.
- Omit duplicate File drivers in the project.
- Allow drivers (in the apps project) to be generated into all
projects.
- Template fix - For IPdriver - DriverBinMemo is always 0. Don't use
this to test.
- Remove invalid name chars from a name when create an external name
for SQL.
- If no external names, don't generate external name for Memos.
2.75 Released 18 July 2007
- Fix can omit common drivers from specific projects (or include
Common drivers in all projects).
- Fix - override export corrected.
- Fix - if external name already exists in field or key, don't add one
(if adding names).
- Check that Project name does not match the application name (and
generate warning if it does).
2.74 Released 12 June 2007
- Fix for External names - when not checked, does not generate
external names.
- Fix for multi-dll apps that require FM3 in the non-data dll apps.
Uses the filename externally (i.e. defined in the data dll)
- Allows long Project and Target names.
- Fix for legacy apps that include abc classes.
- Allow common defines to be entered.
2.70 Released 12 April 2007
- Fix for Multi-Proj and FM3 interaction (M'Proj detects if FM3 is
present) - M'Proj allows FM3 to do data type conversion.
- Feature - Driver Substitution allow generation of arrays for file
drivers that don't support arrays (checkbox in the global extension
template).
- Driver Substitution Fix - if you have a dynamic index, then you need
to add the UserOption SQL to the key. M'Proj will now complain if this
does not exist in the dct.
- Fix - M'Proj ignores quotes in the DriverString (which Clarion
treats as blank).
- Fix - quotes in omit ends (incase omits is not added).
- Fix - only declares the project define mpDLLMode if required.
- Removed Clarion2 support and implemented the start of Clarion7
support.
- Option - allows batch file to be omitted from the project (switch in
global extension template).
- Priority in FM2/3 Init code.
- MAVODBC support - disable Driver Substitution in MAV applications.
2.66 Released 8 May 2006
- Fix for Clarion5 template errors (regression in 2.65)
2.64 Released 6 Aug 2004
- Added support for In-Memory-Data-Driver
- Added support for Clarion 6.1
- Added support for FM3's "ForceSQLDataType" attribute (where data
type = BINARY )
- Improved generation for systems with multiple Data DLL's (thanks to
Steve Rothkin)
- Added support for Clarion's Version resource template
- Added support for Fomin Report Builder Suppression template.
2.63 Released 12 Jan 2004
- Added support for Application Icon into Version files
- Added support for data in dictionary, generated _after_ file
declarations
- Added support for optional CREATE attribute to be added to file
declarations when doing different driver versions
- Added support for forcing the field names to UPPER or lower case.
- Added automatic conversion of DECIMAL to PDECIMAL in ORACLE
declarations
- Added automatic conversion of PDECIMAL to DECIMAL in TOPSPEED
declarations