` Printed Icetips Article

Icetips Article



OOP: Better OOP part 3
2003-04-12 -- Dan Pressnell
 
Newsgroups: comp.lang.clarion,topspeed.topic.oop

March 5, 2006:
Note that the code is now available at:

http://www.icetips.com/downloadfile.php?FileID=59

The highest level of reusibility of an object (CLASS) would be if it were
contained in a DLL.  Here are the basics to get the compiler and linker to
do their job correctly, both for the DLL that contains the class executable
code and an exe or another dll that uses the class.

Let's make some assumptions here.  You will create a class whose code will
be in a DLL file, and that class may refer to global data or procedures in
that DLL app.

First, you must declare the class with some extra attributes, like this.
Assume the name of your dll APP is MyApp

MyClassType    class, type, module('myclasses1.clw'), link('myclasses1.clw',
myapp_linkmode), dll(myapp_dllmode)
... etc.

The module attribute says "Here is where the executable code for my class
is."

The link attribute says "Compile myclasses1.clw if the equate myapp_linkmode
is true, and link it into the exe or dll I am currently creating.  If
myapp_linkmode is false, don't compile it--don't even look for it--and don't
link it."

The dll attribute says "This class's executable code is contained in an
external DLL, not in MyApp."

For the app that you intend to include your class code into, you should put
this in your global embeds:

myapp_linkmode    equate(1)
myapp_dllmode      equate(0)
    include('myclasses1.inc'), once

For any other app, DLL or EXE, that uses this class, you would put this in
your global embeds:

myapp_linkmode    equate(0)
myapp_dllmode      equate(1)
    include('myclasses1.inc'), once

... and in your project settings, add the dll that contains the code to the
external libraries.

(You can also use project settings to set these flags, like this...

myapp_linkmode=>1
myapp_dllmode=>0

... but under nearly all situations with apps (less often with hand coded
projects) using the equates in the global embeds will work fine.

Another consideration is what to put for the MEMBER statement in the class's
executable code module.

Because we have assumed that you are creating a class that must have access
to the global data of your DLL app, you should put this:

  MEMBER('MyApp')

There are cases where you should not specify MEMBER() but those are
specialized cases where you are usually developing some tool that doesn't
have a need to access specific application data or procedures.

Now the bad news:

Because you need one INC file and one CLW file for this to work, the
application generator is not going to give you much help.  You'll have to
use external source files that are outside the application tree environment.
Also, you now have an issue of putting the correct information into the EXP
file so the linker will "export" the class and its methods to make them
visible to other apps that will use the class.

The good news is that I've developed a template that will allow you to do
this within the app procedure tree, and will create, at generation time, the
inc and clw files for you.  It can also parse the INC file and add the
needed entries to the Export section.

This template allows you to keep your class declarations and code in the app
procedure tree like everything else.

You can get the template along with a sample app at
http://toolwares.com/oop_sample.ZIP .  Put the tpl file in your template
registry, and open the oop.app file (c55 required) to see how it's used.
The app file has no dictionary specified, and uses the baseball.mdb (Access
database) that I used in my Better SQL series, using one of the techniques
described there.

I'll discuss the sample application later.

Note:  Using the template, if you get compile errors, you will not be able
to edit them in place (changes won't be saved).  I don't think that can be
fixed.

Dan



Printed November 21, 2024, 11:32 am
This article has been viewed/printed 35398 times.
Google search has resulted in 42 hits on this article since January 25, 2004.