You can
also view these tips on the 3rdParty
Newsgroup.
Draw: Adding functionality to your program
Two Tips for Editing Templates
Smoothwall Experience
Tips for new (and not so new) Clarion Users
Tips for Multi-Proj: Adapting your application for
different backends and a Batch Compiler Tip
Client side, or Server side, filtering
CapeSoft's Refund Policy
Calling CHM Help Files from Ezhelp
Optimizing Clarion Applications for speed
Showing & hiding your windows from the task-tray icon
Draw: Adding Functionality to your Program (23 April 2004)
People often ask us what sort of functions they can add to their
program using our Draw template. As you probably know Draw is a high
performance drawing engine that gives you complete control over 2D and
3D drawings.
While high speed, low-level drawing commands are
desirable in themselves, Draw is also an engine on which we are going
to be basing future products. The existing
CapeSoft Progress product is an
example of this, leveraging the power of Draw.
But Draw is also useful by itself. A recent addition to
the Draw package is an example of using Draw to create window headers.
For a screenshot of this example visit:
Window Header Example Screenshot
Two Tips for Editing Templates
(22 December 2003)
Being a Clarion 3rdparty developer, I
[that's Geoff this week - ed] get to edit
templates virtually as much as anything
else. I still prefer editing templates
inside the Clarion IDE (OK, OK - I know
I'm pretty old - fashioned, but who needs
the Undo button anyway <g> - after all
Clarion programmers don't make mistakes do
they?).
Tip 1
One day I got really tired of
selecting All files and entering *.tpl
when looking using the file dialog box to
select a template to edit. I did a look
around in the IDE as to where to setup the
Clarion Source limits and couldn't find
anything. I thought: "No way - surely they
haven't hard coded this in". Did a source
search on my drive and found the option is
in the c55ee.ini file (c55pe.ini if you're
using Clarion55 professional - or replace
c55 with c60 if you're using Clarion6)
which is located in your clarion\bin
directory. Edited the line, and hey presto
- now it sees tpl and tpw files as Clarion
Source.
It's really simple:
- Open up your c55ee.ini (c55pe.ini,
c60ee.ini or c60pe.ini) file in a text
editor.
- Do a search on 'Clarion Source'
and you should get a line something
like:
4=Clarion source
(*.clw,*.inc,*.trn)=*.clw;*.inc;*.trn|CWedt
Change to:
4=Clarion source
(*.clw,*.inc,*.trn,*.tpl,*.tpw)=*.clw;*.inc;*.trn;*.tpl;*.tpw|CWedt
Tip 2
If you're working on a template and you're
checking code generation into an
application, then load the application and
close it. From there on, every time you
make changes to your template, just click
the compile button, and the application
will compile with the template changes.
This saves you opening and closing the
application every time you want to test
your changes to the template.
Note: You must have the Re-Register when changed and the
Update Template chain when edited
checkboxes checked (Clarion IDE - Setup |
Application Options - on the Registry tab).
Smoothwall Experience (11 December 2003)
A bit off-topic this week, but I
[that's Bruce writing -ed] just had a
rather good experience that I thought I'd
share. We've been on the lookout for a new
proxy/firewall program recently and in
this spirit I downloaded Smoothwall
Express 2.0 (http://smoothwall.org)
. (This is an unsolicited review, and we
don't get anything for it.)
This is a free (GPL) program version of a
commercial package. It's based on a
stripped-down, custom, version of Linux
and turns an old (or new) machine into an
"appliance". Minimum spec is Pentium 75,
600 Meg hard drive (2 Gig recommended for
proxy cache & log files) and 32 megs of
Ram. (More ram
though is recommended - I used 128 Megs).
While a screen & keyboard are used during
the install, they're not needed later as
the maintenance is done through a web
browser.
This box then sits between your LAN and
your internet connection. Doesn't matter
if you have analogue modems, ISDN,
USB/ADSL or Ethernet ADSL (and maybe
more). Smoothwall acts as a very strong
firewall, a proxy server, a DHCP server
(if you want), it supports dynamic DNS (so
you can be a
server- even if you don't have a permanent
IP address) plus some other bits and
pieces. The proxy supports a whole range
of protocols including all the common
stuff like web & ftp etc.
Documentation is nothing short of superb.
Given that I was pretty sure I didn't know
what I was doing (I have no experience
with Firewalls, and very little with
proxies) I actually read the docs before I
started. They were well written, very
clear, and didn't pre-suppose any
information. (Well at least if they did, I
didn't notice.) I was never left guessing,
and I was confident all the way through
that things were "going right".
Client machine setup ranges from the
non-existent (if you're using DHCP) to the
trivial (if like me you have fixed IP
information).
I've only been running it a couple hours
now but I'm hooked. We'll be moving our
office over cautiously - I'll keep you
posted if we hit any snags.
I summary, if I had to, I'd pay for
software like this. Smooth Wall Ltd (www.smoothwall.net)
do a commercial version for bigger sites
that need more features. The fact that
Softwall Express does what I need, and is
free, is a bonus. Pricing aside, all
software should be this slick.
Tips for New (and not so new) Clarion Users. (24 October 2003)
This week's Tip of the Week
focuses on where to start if you are a new Clarion
User, but there may well be some tips here, that
even folk who are not so new to Clarion may
benefit from. There are a number of really useful resources out
there, and we hope this article will help you to
discover some of them.
Websites:
www.clarionmag.com - this site focuses on
Clarion articles. They also include
recent Clarion news. ClarionMag runs on a subscription
basis (i.e. you pay to read entire articles).
There are also some free articles and some free
downloads. It officially updates 48 times a year.
www.outsidetrains.com - Tom Ruby's Clarion Connection. This site keeps
you updated with recent news about all sorts of
Clarion related topics.
www.clarionshop.com - This is the
premier place on the Web to buy Clarion 3rd Party
Applications, and boasts the world's largest
Clarion Accessory store.
www.capesoft.com
- This is our website. We've got loads of really
useful 3rd Party Accessory products for Clarion as
well as our Opinion articles.
www.par2.com - Steve Parkers Place - Tips,
FAQ, Knowledge Base, Clarion Corner and more.
www.encouragersoftware.com/profile/clarlinks.html
- Clarion 3rdParty Profile Exchange.
www.clarionpublisher.com - The Clarion
Foundry. Clarion Technical References & Utilities.
www.sterlingdata.com/gallery2.htm - Clarion
Developers Photo Gallery
www.icetips.com &
www.icetips.net - Clarion News Source. Include
Susan's legendary Clarion Bio's and many articles.
www.artofprogramming.net - Clarion Development
information
www.clarionpost.com - Clarion News and Information
Definitions:
3rd Party Accessory:
Basically this means someone else (a 3rd party) does some really
hard work and wraps it up using Clarion templates
and objects. You add their template to your
application, and hey presto, your application is
doing some really cool things, that you didn't
need to spend large quantities of time having to learn
or implement whatever the product offers. One of Clarion's strengths is
that you are able to easily re-use code. Many of
the 3rd Party products piggy-back off this
strength, further strengthening the Rapid
Application Development nature of Clarion.
Books:
This is what Chet Sapino has to say about Clarion books:
"Here are two very good books I would recommend
to any Clarion programmer who would like to gain serious knowledge on ABCs.
1. Russ Eggen's book on"Programming Objects"
is excellent. I would highly recommend it if you want to gain some
insight on the inner workings of ABC's and programming the various objects. I
enjoyed it very much.
More Info
2. Bruce Johnson's book on "Programming in
Clarion ABC" is also very good. An eye opener on the various templates.
Makes it easy to understand the ABCs. It will cause you to rethink your
various embed strategies from a very practical standpoint.
More Info
/
Review "
Bruce's "Programming in Clarion ABC"
is available from:
ClarionShop:
Printed Registered Mail ($60)
or
Printed Courier ($75)
Newsgroup:
Many Clarion users have benefited greatly from the
advice of others on the Clarion Newsgroup. This is a forum where you can
ask questions, and also learn from others.
As a new Clarion user we would suggest the following newsgroups (there
are more, but these are good ones to start with):
comp.lang.clarion
softvelocity.clarion.third_party
How to use the newgroups:
Click here
news://news.softvelocity.com,
this should open up the newsgroup in your Outlook Express. Then choose
the comp.lang.clarion and the softvelocity.clarion.third_party groups.
comp.lang.clarion is also available via Google (or other newsgroup services) at:
Google Groups
3rd Party Accessories:
There are a lot of really good 3rd Party Accessories out there. You'll find many at
www.clarionshop.com
However one needs mentioning up front:
File Manager 3: When you change your data dictionary in Clarion,
and then recompile your application, your data dictionary is now
different to what how your data has been stored, the last time your
ran your application. So when you run your application you get an
Error 47. You can get around this by using File Manager 3.
It's an absolute must for $249. (Read what users say about it
here)
We hope the above resources spur you on in your Clarion programming.
Tips for Multi-Proj: Adapting your application
for different backends and a Batch Compiler Tip (19 September 2003)
1) Using Multi-Proj to Adapt
your Applications for Multiple Backends
Lesley Dean recently posted an informative article
on the newsgroup, which has been used here to make this tip.
This tip will be of interest to you if you are
thinking of implementing your application in multiple backends.
For example you may want a TPS and a MS SQL version of your application.
Or you may want a TPS, MS SQL and an Oracle implementation of your
application.
Here's how it works:
New in Multi-Proj
is Driver Substitution. Driver Substitution
can be used to generate multiple database support from one app and
one dct. In other words, take your TPS dictionary, and your TPS
app file, and add Multi-Proj Driver Substitution to generate a MSSQL
exe, Oracle exe, etc, and of course your original TPS exe.
i.e. 1 app, 1 dct = many exe's
Maintain your tps file structure in the dictionary, and let Multi-Proj
handle the rest!
Tip: Use
FM3 to automatically
upgrade the various file structures in the backend!
Tip: FM3 can also be used initially to copy the data from
your original TPS files to your new backends!
Note: Driver Substitution handles file declarations only.
Use conditional compiles to handle driver specific code in your app.
2) Tips for using Multi-Proj's Manager (Batch Compiler):
The Multi-Proj Manager (Batch Compiler) uses
DDE to tell Clarion to Generate or Compile a list of Applications
or Projects. Unfortunately DDE is not that stable and so here are
two tips that seem to improve the stability of DDE.
a) If you are using Multi-Proj, then create a shortcut to
the MP.exe program on your desktop. Running it from a shortcut (on the desktop
or in a start menu) seems to improve DDE
reliability a lot. Launching it from inside the IDE (From the accessories menu) seems to be at least 1 culprit
in the unreliability-under-NT sweepstakes...
b) To increase stability try not to use the
Make button, rather use the Smart button. The Smart button will
generate Applications (app) files and compile Project (prj) files.
Links to more information:
Driver Substitution:
www.capesoft.com/docs/multiproj/multiproj.htm
Multi-Proj:
www.capesoft.com/docs/multiproj/multiproj.htm
File Manager 3:
www.capesoft.com/accessories/fm3sp.htm
SQL Tips & Tricks:
www.capesoft.com/docs/fm3/fm3sql.htm
Client side, or Server side, filtering.
(5 August 2003)
A Clarion Browse has support for 2 features. One is called a Range
and the other is called a Filter. Long-time Clarion programmers know
that the most important thing to making high-speed browses is to use
a range whenever possible. They also know that it's important to fill
in the Filter template option rather than hand-code the necessary
filters. After all, filters coded here will be passed to the View
engine, which in turn means it's passed to the back-end. And that
in turn means better performance. Right? Well, not always.
If you subscribe to these tried, and tested, rules, then you might
be hurting performance more than you think. In order to understand
why, you need to understand 2 things.
a) A View doesn't treat a Range different from a filter.
What happens internally is that the range is amalgamated with your
filter statement into a single expression, and this is passed to the
View engine.
b) If the backend is unable to process your filter, then it hands
it back to the View engine for automatic processing on the client
side.
If you put these 2 items together then you'll see that it's possible
for a small part of your filter to cause the whole filter (and this
includes the range) to be processed locally.
For example;
You want to isolate the invoices that belong to a specific customer.
So you set your range such that Inv:CustomerNumber = Cus:CustomerNumber
You also want to filter out Null invoices (i.e. invoices generated
with a Zero amount)
So you create a filter Inv:Total
> 0
And lastly you only want to show invoices where the viewer has access
rights. The access rights code is a bit complicated, so correctly
you make a function HasAccess(), and you add this to the filter. So
the combined filter is
Inv:Total > 0 and HasAccess()
= 1
Cunningly you know about binding, so you go ahead and Bind the HasAccess
function.
Now let's apply this example to a dataset. Let's say you have 10,000
customers, and 1,000,000 invoices.
When you apply the range the filter for the view becomes something
like this;
Inv:CustomerNumber = Cus:CustomerNumber
After applying the total filter the view filter becomes
Inv:CustomerNumber = Cus:CustomerNumber
and Inv:Total > 0
At this point the filter can be done by the backend, and you've got
screaming performance.
But then you add the last part of the filter;
Inv:CustomerNumber = Cus:CustomerNumber
and Inv:Total > 0 and HasAccess() = 1
Because the Range and Filter parts are combined, and because the backend
is unable to process your HasAccess() function (binding it won't make
it work on the backend) the entire filter fails on the backend,
and invisibly it's passed back to the View engine, along with
all 1,000,000 records
to process. Your filter still works but it's very slow.
But hang on, only the filter bit needs to be passed back, the range
still applies right? Wrong. Because the View filter is a single statement
it stands and falls by itself. And even though only one part is failing,
this causes it all to fail.
So what is the solution?
The important thing to remember here is only to put items in your
filter that can be processed by the backend. Perhaps that template
entry should more accurately be described as a Server-Side filter.
The part of the filter that needs to be processed on the Client side,
should be hand-coded into the ValidateRecord embed point, after the
parent call. for example
If HasAccess() = 0 then return
record:filtered.
The part that can be done by the server, in this case the range, and
the inv:total > 0
should be entered onto the template as normal
and passed to the backend as always.
It should be noted that you will not see any difference when using
this technique against an ISAM file system (like Topspeed) since this
has no Server side functionality, and hence all your filtering has
to be done on the client side. But if you ever move your application
to SQL you'll appreciate having done it right the first time, and
this will be one less place for things to go wrong.
CapeSoft's Refund Policy. (28 July 2003)
(Apologies that there was not a Tip of the Week
for last week, but our ISP mangled our Internet connection and by
the time it came up again, there were so many emails to process I
ran out of time).
CapeSoft offers a 30 day money back refund policy.
(In fact for purchases longer than 30 days we normally will issue
refunds anyway).
We do this for a number of reasons:
- We want people to buy with confidence.
- We know our products are great, but we are
also aware that they may not do everything that everyone wants.
So if you aren't satisfied, we want them back and we will refund
you the money.
- We believe this leads to happy customers. And
we like happy customers.
- In fact we also like to help unhappy customers
and so we offer these policies to help customers at least get their
money back if our products don't do the job.
CapeSoft's Refund Policy Page:
www.capesoft.com/policy.htm
Read an article about Refunds:
To Refund or Not - by Bruce Johnson
Calling CHM Help Files from Ezhelp. (15 July
2003)
Did you know that you can call CHM files from Ezhelp?
There are two ways to do this:
1) You can create a tip with additional links to a CHM Help file.
Example Tip Text:
Alternatively you can look at the
<s"Product Documentation"YourProduct.chm>
In the above example, the <s
tag is used to specify a displayname.
or to look at a bookmark in the CHM file use:
For more help please view
the:
<s"Product Documentation"YourProduct.chm::/YourProduct.htm#BookMark>
2) You make the Ezhelp tip link directly to the CHM Help file, so
that no Ezhelp tip is displayed:
Example Tip Text:
<EmailServer.chm::/CapeSoftEmailServer.htm#EmailClient>
Ezhelp is available for $179 at:
www.capesoft.com\accessories\ezhelpsp.htm
Optimizing Clarion Applications for
speed. (8 July 2003)
Here's a tip when your application loops through some work and you
are either displaying the progress on the screen using a Progress
control, a prompt with a percentage of work done, or a prompt with
some sort of indication (e.g. 1 of 50000 records processed).
This is particularly useful when:
sending emails through
NetTalk
processing a whole bunch of records
(This will only apply to hand-coded parts of your application. The
Clarion Process template will already have this kind of code optimized.)
1) Avoid auto display. It will either be very slow (causing a
display() for every time you enter the window. TakeEvent() method
- or in some circumstances you may find it doesn't display your changes)
2) Use some piece of code that will only update your screen say every
100 records, or every few hundredths of a second (every 3 hundredths
of a second works for me). Each strategy is different, and depending
on what you are doing some will work better, than others, but make
sure you are using an optimization strategy. For example:
if ((RecordsProcessed%100)
= 0) or |
(RecordsProcessed >= TotalRecords)
Do UpdateScreen
end
3) When using a progress bar, it's better to have the progress bar
range say 0 to 100, and then only update the progress bar when the
number changes. For example:
Y
Long
L Long
Y = (RecordsProcessed * 100) / TotalRecords
if L <> Y
L = Y
?Progress{prop:progress} = L
end
(L needs to keep it's value so make it sure it's either defined in
your procedure, or static, or in some scope that it will not be destroyed).
4) Rather do a display(?Variable)
than a display()
5) You don't need to display(?MyProgressBar)
it will get automatically displayed.
At the end of the day point (2) will optimize your application the
most.
Showing & hiding your windows from the
task-tray icon. (30 June 2003)
If you are using WinEvent to minimize your application
to the Task Tray, then the following code can be used to Show and
Hide your window.
There are three routines listed below:
WindowHide (will hide your application to the task tray - you
must be using the WinEvent extension template "Add Icon to the
Intray")
WindowShow (will show your application with the focus)
WindowShow_NoFocus (will show your application (i.e. Bring to
front), but it will not have the focus.
This is really useful if you want to popup a message or note, but
don't want to irritate users by grabbing the focus)
! -------------------------------------
! Hides Window (opposite of WindowShow)
! Useful for use with the TaskBar icon code
WindowHide Routine
window{prop:iconize} = true
window{prop:hide} = true
! -------------------------------------
! Shows Window (opposite of WindowHide)
! Useful for use with the
TaskBar icon code
WindowShow Routine
if window{prop:iconize}
= false
window{prop:iconize}
= true
end
window{prop:hide}
= false
window{prop:iconize}
= false
! -------------------------------------
! Shows Window (opposite of WindowHide)
! Useful for use with the
TaskBar icon code
! No Focus is gained
WindowShow_NoFocus
Routine
window{prop:iconize} = false
window{prop:hide} = false
WinOnTop()
WinNotOnTop()
WinEvent is available for $149 at
www.capesoft.com
You can also view these tips on the
3rdParty Newsgroup.
|