THANK YOU............Thank You and Congratulations!
REGISTRATION.........Registration
TECH. SUPPORT........Technical Support
TRADEMARKS...........Trademarks
READ.ME..............The READ.ME file
GENERAL LICENSE......Your dCLIP License
DIST LICENSE.........dCLIP Distribution License
SITE LICENSE.........dCLIP Site-Licenses
REVISION 4.00........dCLIP 4.00 - What's new?
REVISION 4.01........dCLIP 4.01 - What's new?
REVISION 4.02........dCLIP 4.02 - What's new?
REVISION 4.1.........dCLIP 4.1 - What's New?
WHAT'S HOT?..........What's the HOT NEW STUFF in dCLIP 4.1
COMPUTER.............Computer System Requirements
SOFTWARE.............Other Software Required
SOFTWARE.............Other Software Recommended
SPECIFICATIONS.......Technical Specifications
COMMAND LINE ARGS....Running dCLIP with Command-Line Arguments
GETTING STARTED......Please read this to GET STARTED with dCLIP
IMPORTANT............Important Notes (Please Read)

THANK YOU

Thank You and Congratulations!

Description:

You have purchased a license to use dCLIP, a finely
crafted, full feature, development system and library for
Clipper developers, programmers and end-users of Clipper
applications. Please take the time to read this intro-
ductory section of the documentation which explains how
to get the most value from this product.

REGISTRATION

Registration

Description:

IF you wish to receive the full benefits of our customer
services, then you must register your software. Please
copy the serial number from the master diskette label onto
the reply-mail registration card and mail it to us as soon
as possible.

In fact, take a moment to fill out the card right now while
you have the master diskette and serial number handy.

The timely registration of the product, by sending in the
registration card, enables us to provide you with technical
support, updates, enhancements, new product information and
access to our Web-Site.

We are always making improvements or additions to the
modules provided in this package. If you have sent us your
registration card, we will notify you of any updates we
make available, including FREE updates.

TECH. SUPPORT

Technical Support

Description:

We are committed to help you get the most out of dCLIP. If
you have any question about the use of dCLIP, we encourage
you to write to us at:

DONNAY Software Designs
P.O. Box 16330
Boise, ID 83715-6330

or leave us a message at:

FAX: (208) 331-2621

CompuServe: ID number 73227,1225
Leave an E-mail message on E-mail (GO MAIL), or the
Clipper forum (GO CLIPPER).

Internet E-mail: 73227,1225@compuserve.com
rdonnay@dclip.com

Web-Site: http://www.dclip.com

We want you to be satisfied with your purchase of dCLIP so
we encourage that you call us, fax us, e-mail us or leave us a
message on our new Website BBS if you are having
problems. We provide FREE technical support for as long as
you own dCLIP, however we sometimes may need to limit the
amount of time we can spend on individual problems, that is
why we recommend that you use the CompuServe Clipper forum
or our own BBS forum to aid you in solving some of your
more pressing or stubborn problems.

If your support is requested by FAX, BBS, CompuServe or
mail it is recommended that you provide us with as much
information as possible to help you with your problem.
Please give us at least the following information:

* Other Clipper-compatible products you are using with
dCLIP.
* Operating system and version you are using
* Important environment information such as Expanded
Memory Managers, etc.
* Your system hardware configuration.

If your need is urgent please feel free to call us at
(208) 331-2516 Monday through Friday between 9:00am and
5:00pm Idaho, Mountain, USA time.


-- FREE UPDATES --

dCLIP 4.x is an evolving product and it is likely that
there will be upgrades over the lifetime of the product
to correct bugs or to provide more compatability with
third-party products. These upgrades will be posted
regularly on our BBS and are free to all registered
users.

TRADEMARKS

Trademarks

Description:

Trademark Owner

dCLIP DONNAY Software Designs
NOLINK Sunbelt Computing, Inc.
Clipper Computer Associates Intl.
Rtlink Pocket Soft, Inc.
Blinker Blink, Inc.
Qedit Semware, Inc.
Brief, dBrief Solution Systems, Inc.
Overlay(), ProVision SofDesign, Inc.
Dos, MS-DOS, CodeView Microsoft Corporation
PC-DOS, IBM International Business Machines
PKZIP, PKUNZIP Pkware, Inc.
dBASE, dBASE-III,
dBASE-IV Borland International
FUNCKy Dirk Lesko Associates
WarpLink Hyperkenetix, Inc.
Faxual ExtraSensory, Inc.


READ.ME

The READ.ME file

Description:

The text file titled READ.ME is located on Disk 1 of the
distribution diskettes and contains information about any
late developments, additions, or changes that did not make
it into the printed documentation. Please read this file
before using dCLIP. It is an ordinary text file you can
view with any text editor, word processor, or the DOS
command: TYPE READ.ME. To PRINT the READ.ME file use the
following DOS command: COPY READ.ME PRN.

GENERAL LICENSE

Your dCLIP License

Description:

1. You MAY freely distribute any .EXEcutable application
that uses any portion of the dCLIP libraries in your
own custom applications, provided that the executable
program is not simply a collection of functions from
dCLIP libraries.

2. You MAY NOT distribute the DCLIP.EXE engine program or
any custom versions of the DCLIP.EXE engine that are
built from the dCLIP libraries without permission from
DONNAY Software.

The ability to customize the DCLIP.EXE developer's
engine is provided with the dCLIP libraries ONLY to
allow the programmer to develop applications which use
functions from third-party libraries or the users own
libraries and application code.

3. You MAY NOT distribute to any third party, any portion
of the dCLIP libraries, dCLIP source code, or dynamic
library utilities. This includes the following files:

DCLIP.LIB, DCLIPNL.LIB, DCLIPR.LIB, DCLIPS.LIB,
DLIBE.EXE, DCLIP.EXE

4. You MAY use the dCLIP libraries or DCLIP.EXE only one
one computer at a time for each license that is owned.
The dCLIP libraries, DCLIP.EXE engine, or any custom
dCLIP engine may be installed on a network server for
shared use by multiple programmers, however, it is not
allowed that there be more users of the product at any
one time than the number of paid licenses.

DIST LICENSE

dCLIP Distribution License

Description:

dCLIP.EXE programs may be licensed for unlimited distribution
with your own product for a very reasonable fee. See the
sample license agreement below and call our office at
208-331-2516 for details.

Examples:

   
   
DONNAY SOFTWARE LICENSE AGREEMENT

This is a license agreement between you (DEVELOPER) and DONNAY
Software Designs (DONNAY). READ THE TERMS AND CONDITIONS OF THIS
LICENSE AGREEMENT CAREFULLY BEFORE SIGNING THIS DOCUMENT. BY
SIGNING THIS AGREEMENT, YOU ARE AGREEING TO BE BOUND BY THE TERMS
OF THIS AGREEMENT.


1. LICENSE GRANT. DONNAY grants to you, and you accept, a non-
exclusive license to distribute custom dCLIP engines as part
of your own product or service. A custom dCLIP engine is
defined as an .EXE (executable) program created from the dCLIP
libraries and which may contain as much as 100% of the
functions that are part of the standard DCLIP.EXE program
distributed with the dCLIP retail package. The engine also
includes any or all database (DC*.DBF) files distributed with
the dCLIP retail package. You may distribute as many copies
of the engine and/or database files as you wish during the
term of the agreement.

2. DONNAY'S RIGHTS. You acknowledge and agree that dCLIP is a
proprietary product of DONNAY, protected under U.S. copyright
law, international treaty provisions, and trade secret laws
of general applicability. You further acknowledge and agree
that all rights, title, and interest in and to dCLIP are and
shall remain with DONNAY.

3. OTHER RESTRICTIONS. You may not lease, sell or rent the dCLIP
engine that has been customized for distribution. You may not
distribute any portion of the source code (.PRG files) or
libraries (.LIB files).

4. LIMITATION OF LIABILITY. DONNAY'S cumulative liability to you
or any other party for any loss or damages resulting from any
claims, demands, or actions arising out of or relating to this
agreement shall not exceed the license fee paid to DONNAY for
the use of dCLIP. In no event shall DONNAY be liable for any
indirect, incidental, consequential, special, or exemplary
damages or lost profits, even if DONNAY has been advised of the
possibility of such damages. SOME STATES DO NOT ALLOW THE
LIMITATIONS OR EXCLUSION OF LIABILITY FOR INCIDENTAL OR
CONSEQUENTIAL DAMAGES, SO THE ABOVE LIMITATION OR EXCLUSION
MAY NOT APPLY TO YOU.

Page 1




5. GOVERNING LAW. This License Agreement shall be construed and
governed in accordance with the laws of the State of Idaho,
United States of America.

6. SEVERABILITY. Should any term of this license agreement be
declared void or unenforceable by any court of competent
jurisdiction, such declaration shall have no effect on the
remaining terms hereof.

7. MONETARY REQUIREMENTS. This license is granted upon receipt
of payment in the sum of __________ U.S. dollars.

8. TERM OF AGREEMENT. The term of this license is for a 5-year
period from the date of effectivity.


Executed this _________ day of ________, ________, at Boise,
in the State of Idaho.



DEVELOPER DONNAY


Company ________________________ Donnay Software Designs

Address ________________________ 988 E. Riverpark Lane

________________________ Boise, Idaho 83706

Tel. ________________________ (208) 331-2516

Name ________________________ Roger J. Donnay

Title ________________________ President

Signed ________________________ Signed ___________________



Page 2


SITE LICENSE

dCLIP Site-Licenses

Description:

dCLIP may be licensed for use by an unlimited number of
programmers or users for a very reasonable fee. See the
sample license agreement below and call our office at
208-331-2516 for details.

Examples:

   
   
SITE LICENSE AGREEMENT


This is a license agreement between you, the LICENSEE, and DONNAY
Software Designs (DONNAY). By signing this agreement and by the
payment of the site-license charges listed below, you are agreeing
to be bound by the terms of this agreement.


1. LICENSE GRANT. DONNAY grants to you, and you accept, a non-
exclusive license to concurrently share the use of the DONNAY
program (dCLIP), the PRODUCT, previously purchased by LICENSEE
and identified by the license number ______________________,
by an unlimited number of individuals at the address site known
as:

____________________________________________________________

____________________________________________________________

____________________________________________________________

The PRODUCT may be used concurrently on individual computers
or on networked computers, provided that all concurrent use
is confined to the above site address.


2. DONNAY'S RIGHTS. You acknowledge and agree that the PRODUCT is
a proprietary product of DONNAY, protected under U.S. copyright
law, international treaty provisions, and trade secret laws of
general applicability. You further agree that all rights,
title, and interest in and to the PRODUCT are and shall remain
with DONNAY.


3. OTHER RESTRICTIONS. You may not lease or rent the PRODUCT. You
may not disassemble, decompile, or otherwise reverse engineer
the PRODUCT. You may permanently transfer the PRODUCT and the
accompanying User Manual if the recipient agrees to the terms of
this agreement, and if you retain no copies of either the
PRODUCT or the User Manual. The transfer of the single copy and
license, however, does not entitle the recipient to site license
concurrent use without prior approval of DONNAY.


4. END USER'S DISTRIBUTION RIGHTS. You have a royalty-free right
to distribute dynamic libraries (.DLB's) and executable program
(.EXE's) using functions from the PRODUCT libraries provided
that you (a) distribute the above code in conjunction with and
as part of your software product, (b) agree to indemnify, hold
harmless, and defend DONNAY from and against any claims or
lawsuits, including attorney's fees, that arise or result from
the use or distribution of your software product, and (c) that


Page 1 of 3



the programs containing the PRODUCT functions are not competing
products of the PRODUCT. You are NOT AUTHORIZED to reproduce
and distribute dCLIP.EXE or any custom dCLIP "engine",
DLIBE.EXE, or any portion of the dCLIP libraries or source code
for use by any individual not located on the site premises
designated in paragraph 1.


5. LIMITED WARRANTY. DONNAY warrants that the Program Diskette(s),
in which dCLIP is imbedded and the User's Manual shall, for a
period of 90 days from the date of commencement of the License
Agreement (referred to as the Warranty Period), be free from
defects in material and workmanship. DONNAY further warrants
that during the Warranty Period the PRODUCT shall operate
substantially in accordance with the functional specifications
in the User's Manual. You agree that the foregoing constitutes
your sole and exclusive remedy for breach by DONNAY of any
warranties made under this agreement. EXCEPT FOR THE WARRANTIES
SET FORTH ABOVE, THE PRODUCT IS LICENSED "AS IS", AND DONNAY
DISCLAIMS ANY AND ALL OTHER WARRANTIES, WHETHER EXPRESS OR
IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
PARTICULAR PURPOSE.


6. LIMITATION OF LIABILITY. DONNAY'S cumulative liability to you
or any other party for any loss or damages resulting from any
claims, demands, or actions arising out of or relating to this
agreement shall not exceed the license fee paid to DONNAY for
the use of the PRODUCT. In no event shall DONNAY be liable for
any indirect, incidental, consequential, special, or exemplary
damages or lost profits, even if DONNAY has been advised of
the possibility of such damages.


7. GOVERNING LAW. This License Agreement shall be construed and
governed in accordance with the laws of the State of Idaho, USA.


8. SEVERABILITY. Should any term of this license agreement be
declared void or unenforceable by any court of competent
jurisdiction, such declaration shall have no effect on the
remaining terms hereof.


9. TERM OF AGREEMENT. The term of this license is for a 1-year
period from the date of effectivity. The annual renewal fee
of the site-license is guaranteed not to exceed the initial
site-license fee for a minimum of 5 years from the initial date
of effectivity. Payment of annual renewal fees entitles the
LICENSEE to receive the most current version of the product
and to receive all intermediate releases of the product at no
additional charge.


10. LICENSE FEES. The annual site-license fee is ______________.


Page 2 of 3





Executed this _________ day of ________, ________, at Boise,
in the State of Idaho.



DEVELOPER DONNAY


Company ________________________ Donnay Software Designs

Address ________________________ 988 E. Riverpark Lane

________________________ Boise, Idaho 83706

Tel. ________________________ (208) 331-2516

Name ________________________ Roger J. Donnay

Title ________________________ President

Signed ________________________ Signed ___________________























Page 3 of 3



REVISION 4.00

dCLIP 4.00 - What's new?

Description:

-----------------------
dCLIP 4.00 New Features
-----------------------

1. The new functions and new commands listed above.

2. Compatability with Clipper 5.2 and 5.3.

3. Color array is now automatically initialized in an INIT PROC.
Prevents possibility of runtime error if DC_ClrArr() is not
called or dCLIP error handler is not linked in.

4. The Query System has been re-written to provide a more
consistent user-interface in relation to other dCLIP functions.
See DC_Query() and DC_QueryBuild(). It also includes new
"tagging" features to allow the user to tag or untag
records based on the selected query. The Query Builder
recognizes any logical field named "TAG" in the database
and will set the value of this field rather than using the
DCTAGS array.

5. The dot-prompt now supports an improved command-stack including
the option of DOSKEY emulation via DC_DOTDOSKEY(). Clicking the
mouse on the up/down arrows at the end of the command line will
display previous/next command. Clicking the mouse to the left
of the dot-prompt will pop-up a browse of the command stack.
Double-clicking the mouse within the command line area will
execute the command line. The size of the command stack is now
configurable via DC_DOTSIZE().

Batch (*.DCB) files will be executed automatically if a command
is entered with the same name as the .DCB file and is not a
dCLIP command or has not been loaded in a command set.

6. New Browse-system features ( DC_BrowseDb() ) :
* Improved pull-down menus.
* Alt-T : Total Selected column
* Alt-N : Select index by selected column
* Alt-Q : Scope by selected column (Range-Query)
* Total numeric column(s)
* Improved performance on relational (one-to-many) browses
and filtered databases.
* User-defined menus (on-the-fly)
* Improved browse-design features
* BROWSE editor system - Create/edit BROWSE configuration
and source code for restoring a browse
configuration.
* Context-Help on all menu selections (Press F1)
* Improved column configuration
- Multiple line headers
- Pictures, colors, valids
* Improved mouse support
- Move or size columns
* New BROWSE DICTIONARY system :
Browse configurations can now be saved to the DCBROWSE.DBF
dictionary file. This dictionary system can be used in conjunction
with BROWSE VIEW validations in the new EDIT system or in your
own GETS or with your menu system to save all system browses
and restore them at will. See the documentation of the new
DC_BROW*() functions.

7. New Database EDITOR features ( DC_EditDb() ) :
* Improved pull-down menus.
* User-defined menus (on-the-fly)
* User-defined Hot-Key Groups (on-the-fly)
* Field-configuration editor:
Create/edit the field configuration then save to an array file,
data-dictionary, or source-code.
* User-defined field layouts (on-the-fly). Fields and descriptors
can be placed anywhere within the virtual screen area. The
virtual screen automatically scrolls vertically and/or
horizontally when fields are moved beyond the screen boundaries
or fields outside the visible screen area are selected. There is
no limit to the number of fields that can be placed on the screen.
* Fields or Groups-of-fields can be easily relocated with cursor
keys or mouse.
* Imbed memo text anywhere within the edit screen.
* Many types of validations
* Roll-back changes to an edited record
* New HOT-KEYS speed-up screen design. Press F1 for list of keys.
* Context-Help on all menu selections (Press F1)
* New EDIT DICTIONARY system :
Editing configurations can now be saved to the DCEDIT.DBF
dictionary file. This dictionary system can be used in conjunction
with your menu system to save all system Data-Entry screens and
restore them at will. See the documentation of the new DC_EDIT*()
functions.

8. New Pull-down menu system features :
* Better support of sub-sub-menus
* Better support of help messages and context-help
* Lower memory usage and better performance
* Conditional-compiling of menu-items at runtime
* Better support of return values.
* Support of Accelerator keys (like Windows)
* Designed for Hard-coded or Data-Driven applications
* MENU Designer/Editor system:
- Create / Edit Menus and Accelerators
- Save/Restore Menu to/from Data-Dictionary (DCMENU.DBF) or array
- Save Menu to source-code
* See the documentation of the new DC_MENU*() functions.

9. Improved Array-Browser
* Print contents of an array

10. Improved GET system

SCROLLABLE GETS
---------------
DC_ReadModal() will now support scrollable GETS automatically.
GETS can be written anywhere outside the pre-established GET
scroll region yet they will be visible only within the scroll
region. When the cursor is bumped against the scroll
boundaries, the GETS will scroll up/down or left/right. This
technique allows you to design GET screens which are larger
than the physical display size or a designated display window.
DC_ReadModal() also supports easily editing of Array elements
that are written to the screen in a FOR..NEXT loop.

Example :

USE (cDataBase)
aData := Array(Fcount())
FOR i := 1 TO LEN( aData )
aData[i] := FieldGet(i)
NEXT
cSaveScrn := DC_ReadBox( 10, 10, 20, 60,, @aReadArea )
FOR i := 1 TO LEN(aData)
@ i,12 SAY PADL(Field(i),10) GET aData[i] APOINTER i
NEXT
DC_ReadModal( GetList,,aReadArea )
DC_Impl( cSaveScrn )


NAVIGATION
-----------
DC_ReadModal() supports additional navigation features to make
it easier to move thru a table of keys via the keyboard.

Alt-UpArrow : Moves to first GET directly above cursor position.
If no GET exists directly above, then moves to
Alt-DnArrow : Moves to first GET directly below cursor position.
If no GET exists directly below, then moves to
closest GET below cursor position.
Alt-RtArrow : Moves to first GET directly to the right of the
current GET.
Alt-LtArrow : Moves to first GET directly to the left of the
current GET.


CHECK BOXES and RADIO BUTTONS
-----------------------------
DC_ReadModal() now supports CHECK BOXES and RADIO BUTTONS
with a very simple syntax.

Example:

LOCAL GetList := {}, aCheck := {' ','û',' '}, nLength,;
aRadio := {'*',' ',' ','*',' ',' '}, ;
lAscii := .f., lBackup := .t., lPrinter := .f., ;
aReadArea, cComPort, ;
cSaveScrn := DC_ReadBox( 3,5,21,70,,@aReadArea )

/* -- Paint Check Boxes -- */
@ 5,10 TO 11,35
@ 5,12 SAY ' Check options below '
@ 7,12 SAY 'Convert to ASCII ' GET aCheck[1] CHECKBOX ;
MEMVAR lAscii DELIMS '(û)'
@ 8,12 SAY 'Keep Backup File ' GET aCheck[2] CHECKBOX ;
MEMVAR lBackup DELIMS '(û)'
@ 9,12 SAY ' Copy to Printer ' GET aCheck[3] CHECKBOX ;
MEMVAR lPrinter DELIMS '(û)'

/* -- Paint Radio Group 1 -- */
@ 13,10 TO 19,35
@ 13,12 SAY ' Select Page Length '
@ 15,12 SAY ' 40 Lines ' GET aRadio[1] RADIOGROUP 1 ;
MEMVAR nLength DELIMS '(*)' VALUE 40
@ 16,12 SAY ' 55 Lines ' GET aRadio[2] RADIOGROUP 1 ;
MEMVAR nLength DELIMS '(*)' VALUE 55
@ 17,12 SAY ' 66 Lines ' GET aRadio[3] RADIOGROUP 1 ;
MEMVAR nLength DELIMS '(*)' VALUE 66

/* -- Paint Radio Group 2 -- */
@ 13,40 TO 19,65
@ 13,42 SAY ' Select Com Port '
@ 15,42 SAY ' Com 1 ' GET aRadio[4] RADIOGROUP 2 ;
MEMVAR cComPort DELIMS '(*)' VALUE 'COM1'
@ 16,42 SAY ' Com 2 ' GET aRadio[5] RADIOGROUP 2 ;
MEMVAR cComPort DELIMS '(*)' VALUE 'COM2'
@ 17,42 SAY ' Com 3 ' GET aRadio[6] RADIOGROUP 2 ;
MEMVAR cComPort DELIMS '(*)' VALUE 'COM3'

DC_READMODAL( GetList,,aReadArea )
DC_Impl( cSaveScrn )
RETURN { lAscii, lBackup, lPrinter, nLength, cComport }

11. New "Key" Dictionary system

Writing a Data-Driven application requires a database of Key
definitions. dCLIP 4.0 uses a new Key Dictionary system that
uses DCKEY.DBF to store key definitions for loading to arrays
and/or Set-Keys and a new Key-Editor for maintaining the
Key Dictionary database. Each key group is defined by an
8-character name and can be loaded or unloaded simply by
reference to its name.

Example: DC_KEYEDIT( "MYKEYS" ) or KEY EDIT MYKEYS
DC_KEYLOAD( "MYKEYS" ) or KEY LOAD MYKEYS
DC_KEYCLEAR( "MYKEYS" ) or KEY CLEAR MYKEYS

The DCKEY.DBF database contains a key group named "TEMPLATE"
that can be used for quickly creating new key groups. Just
"tag" the keys you want in the new group with the SPACE BAR
or mouse then save the group to the Key Dictionary. Any
key on the keyboard can be defined to return a Character
string, a macro, evaluate a code-block, or stuff the keyboard
with a sequence of other keys. Keys can even be forced to
"no action" to completely disable the key.

12. The preliminary core of a screen-painter system has been completed
but not yet documented.

13. Support for Six Driver 3.0 Vari-fields in Browse, Edit and
Modify Structure.

14. Pre-processor improvements:

Clipper .CH files have been converted and linked into the library
so they can be enabled simply by the INCLUDE DEFAULT (set) command
at the dot-prompt. The Clipper .CH files no longer need to be
available on a drive device to use them at the dot-prompt.

Example: INCLUDE DEFAULT SET
INCLUDE DEFAULT INKEY

. ? SET(_SET_PRINTFILE), K_ESC
LPT1, 27

15. New "Screen" (Dialog Window) Dictionary system

Writing a Data-Driven application requires a database of Screen
object definitions and Dialog Windows for user input. dCLIP 4.0
uses a new Screen Dictionary system that uses DCSCRN.DBF to store
screen definitions for loading to arrays and/or painting the screen
with Boxes, text, fill-areas, Normal GETS, Memo GETS, Radio-
Button GETS, Check-Box GETS, List-Boxes, etc, and a new Screen-
Editor for maintaining the Screen Dictionary database. Each screen
group is defined by an 8-character name and can be loaded or
unloaded simply by reference to its name.

Examples: DC_SCRNEDIT( "MYSCREEN" ) or SCREEN EDIT MYSCREEN
DC_SCRNPAINT( "MYSCREEN")

The new database EDITING system uses the Screen Editor for creating
user-defined background text, fill-areas and or boxes. The
DC_ScrnPaint() function will paint the screen objects using
passed screen coordinates and/or offsets to allow painting of
the objects in movable and re-sizable screens.

16. The dCLIP Help system has been improved to provide context-help
in addition to the standard help menu. Several new fields have
been added to DCHELP.DBF and a new index file will be created
for indexing on the new PROC_NAME field. A new function named
DC_HELPF1() can be passed a HELP CODE of up to 15 characters or
the F1 key can be set to call DC_HELPF1() and it will
automatically be passed the current PROCNAME(). If the
passed parameter matches any PROC_NAME field then the data in
the found context help record will be displayed in accordance
with the window coordinates for that record. Context help can
be added or edited on the fly by simply pressing ALT-F1.

The new menu system also allows for a 22-character HELP CODE for
each menu item which is automatically passed on to the context
help system if F1 or ALT-F1 is pressed.

A system of "Hyper-links" now allow quick navigation between
related help screens based on the values in the SEE_ALSO
field.

The system has been redesigned to allow the programmer to
create his/her own help system and then write the entire
system to a set of .TXT files for compiling with the Expert
Help compiler.

More Print Options, including Tagging of a group of records
and printing the tagged records. Output to the the printer
or a file.

17. MODIFY STRUCTURE now creates backup files with the same name
as the original database but with the extension .DBK for the
database and .DTK for the memo.

18. New FIELD DICTIONARY system is used to define
field configurations for creation or modifying of databases
and for establishing the default values for setting up Browse
and Editing (Data-Entry) systems. The DCFIELDS.DBF database
contains the field definition for everything related to a
database field including name, type, length, decimals, long
description, colors, help prompts, context-help codes, default
values, editing options, validation requirements, etc. See
the documentation of the new DC_FIELD*() functions.

19. New FILE DICTIONARY system is similar to the current WORK system
except that all file, index, and relation data is stored in a
single DCFILES.DBF dictionary. This dictionary is used when
restoring work areas. A tag name is given to each group of
files and they can all be opened by simply calling the
DC_WORKRESTORE() function and passing it a group tag name.
See the documentation of the new DC_FILE*() functions.

20. New CODE DICTIONARY system is used to establish look-up tables
of values for a code set. This dictionary system can be used in
conjunction with CODE validations in the new EDIT system or in your
own GETS to pop-up pick-lists of pre-designated values. See the
documentation of the new DC_CODE*() functions.

21. New USER DICTIONARY system is used to establish optional passwords
and User ID's with an access-control system that assigns keys
to locks which are put on menu selections and/or database
fields when editing and browsing.

21. dCLIP.EXE may now be started with Command Line arguments for
options such as restoring work areas, browse configurations,
edit configurations, running a menu, running a functin, etc.
See the DCLIP.NG file: COMMAND LINE ARGS (INSTALL) or
DC_EXECUTE() (FUNCTIONS) or run dCLIP /H for more information:

Examples:

dCLIP /R DBFNDX /D CUSTOMER /I CUSTNAME,CUSTNMBR /B /Q
dCLIP /M MENU000
dCLIP /T
dCLIP /W CUSTOMER /E /S DCLIPSYS.2
dCLIP /O TEST.OBJ /F TEST( DATE(),TIME() )
dCLIP INVOICES.DBF
dCLIP TEST.OBJ
dCLIP TEST.DCB
dCLIP CUSTOMER.DCW

22. New Print features:

Browsing and Editing systems now support improved printing.
These systems can now be used as a front-end to simple
report-writing. Data-Entry screens and browse screens can
now be printed exactly as they are displayed. Use the
browse and edit designers to create the desired view, then
save it to the browse or edit dictionary and recall it at
any time to send to the printer. Some features are not
quite completed and will be finished in next release.

23. A set of new *.INI file support functions have been added to
provide the ability to read and save *.INI files from arrays.
This provides compatiblity with Windows-style *.INI files.
See DC_IniLoad() and DC_IniSave().

24. New Color Configuration features:

System colors can now be changed by editing the DCCOLOR.INI file,
or you can still use the COLOR SETUP command. The new DCCOLOR.INI
file will be created if it does not already exist.

25. SET Environment editor now displays and Saves DCLIP.SYS SETS
in alphabetical order.

26. New FIELD MAP DICTIONARY system is used to provide mapping between
fields of different databases. This system supports complicated
importing and exporting projects and moving data between
databases during data-entry using new validations. See the
new DC_FMap*() functions.

27. New PROGRAM DICTIONARY system allows the use of the dCLIP
interpreter in a variety of new ways. Write a program and
save it in the DCPROG.DBF database, then call it and execute
it at any time from a menu, a data-entry validation, etc.
See the new functions: DC_ProgMaint(), DC_ProgLoad(),
DC_Program(). The dCLIP interpreter now supports DO..WHILE,
FOR..NEXT, IF..ELSE, DO CASE, PARAMETERS and RETURN values so
you can write "interpreted" functions.


REVISION 4.01

dCLIP 4.01 - What's new?

Description:

Revision 4.01 Bug Fixes and/or additions

1. DC_LOG() now allows ability to enter a memo.

2. DC_BrowRestore() reloads browse configuration when called a
second time rather than simply restore the screen from the
current static array. Causes excessive slowness.

3. Added comments to each Screen Group in DCSCRN.DBF.

4. Added a logical new parameter to pass to DC_BrowRestore() for
Saving and clearing SET KEYS before calling DC_BrowseDb(), then
restoring the keys after returning.

5. Added a logical new parameter to pass to DC_EditRestore() for
Saving and clearing SET KEYS before calling DC_EditDb(), then
restoring the keys after returning.

6. DC_Gateway() now uses RUN command instead of SwpRunCmd() if
running in protected mode. Blinker's SwpRunCmd() causes
problems with DOUBLESPACE.

7. Added Accelerator Key to Push-Buttons in Screen Painter. Also
fixed a few bugs.

8. Added a Code-Table look-up in Screen Dialog Painter on a GET.

9. Now can abort Query from the Query Menu.

10. Now supports PageUp/PageDown in DC_Scrnpaint().

11. DC_Init() now reports the full path of the DCLIP.SYS it is
loading.

12. DC_Dot() needed a parameter to Save, Clear and Restore SET KEYS.
Example: DC_Dot(,,.t.)

13. Needed to insure that pressing Alt-I when not on an indexed
column of DC_BrowseDb() shows the index file name or
description.

14. DC_DictRdd() needed to be set in DCLIP.SYS. Now can add
RDDDICT=(rdd) in DCLIP.SYS and DC_SetEdit().

15. Needed a new function: DC_PrgFormat() for scanning a .PRG file
and producing output code that nests the code.
Command: PRG FORMAT [(cPrgFile)] [INDENT (nIndent)]
Will produce file named (cPrgFile).DRG.

16. Needed to turn off Prompt in DC_STRUUPDATE() as a programmer's
option. Added a 5th parameter (lPrompt).

17. Needed .DLL (Dynamic-Linking) support for Blinker 4.0.
Added new functions and commands:
DC_DllLoad((cDll))
DC_DllFree((cDll) | 'ALL')
DLL [LOAD] [(cDll)]
DLL FREE [(cDll)] | ALL

18. Needed support for DC_HUNT() in the AUTOSEEK feature of
DC_DBCHOICE().

19. Needed DC_NumIncr() to roll-over numbers that increment past a
specified value. Added two new parameters (cLoVal) and
(cHiVal).

20. The UPDATE Command did not work properly at the dot-prompt
unless _FIELD-)(cField) was in the REPLACE statement.

21. Needed a place to store a code block for each user to be used
for painting a background wall before painting the user menu.

22. Changed the behavior of DC_BrowseDb() when EOF() is reached with
the PgDn or Down Arrow key. Now, editing (append) mode is not
invoked until the ENTER key is pressed.

23. Needed to add some features to DC_ReadDPick(). Added 5 new
parameters:

24. Needed to make sure that dCLIP's HELP SYSTEM did not override
any existing help system mapped by SET KEY F1 TO (help proc).
Rather than changing lots of code, it was simpler and more
stable to add a new function to insure that any calls to
DC_HELPF1() get re-routed to any other help system. Added a
new function DC_HELPBLOCK( (bHelp) ) to point to the help
system function to call. If you have problems with the dCLIP
help system conflicting with your help system, add the
following line of code at the start of your program:

DC_HelpBlock( {|a,b,c|Help(a,b,c)}

25. Added AUTOSEEK capability to DC_BrowseDb() and DC_EditDb().
Can be selected from the SEARCH (FIND Options) menu.

26. Increased amount of memory given to SPOOL command in
DC_SetP('J').

27. Changed the hot-keys used for Adding and Deleting records in the
Browse system ( DC_BrowseDb() ) and Data-Entry ( DC_EditDb() )
for more compatability with user expectations.

The DEL key and Ctrl-U key will now delete a record. Previously,
the DEL key was used to delete a Column from the Browse. Now
this is accomplished with the Ctrl-Minus key on the numeric key
pad or from a menu selection.

The INS key and Alt-A key will now append a record. Previously,
the INS key was used to insert a Column in the Browse. Now this
is accomplished with the Ctrl-Plus key on the numeric key pad
or from a menu selection.

28. Added the ability to define the behavior of the DEL key in the
Browse or Data-Entry system so the programmer can establish
whether or not the record should be (1) Marked for deletion,
(2) Blanked, (3) Execute a custom code block, or (4) No Action.

29. The default value for SET KEYSTAT is now OFF.

30. The Field Editor when called from Browse Menu edited the browse
columns rather than the database fields.

31. Needed ability to append records from another database when
database is being used SHARED. Added a new function
DC_AppShared((cFromAlias)) and a new command:
APPEND SHARED FROM (cFromAlias). Note: this will work only on
databases with the exact same structure.

32. DC_SetP() now works with a printer selected for a specified user.
If a printer number has been selected in USER EDIT for a user
and the user logs on, then that printer will be selected rather
than the printer flagged by USE_FLAG.

33. Needed to be able to save BROWSES and EDITS for specific user(s)
and restore a custom BROWSE and EDIT based on current logged on
user ID. Added new fields to DCBROWSE.DBF and DCEDIT.DBF.
These structures will be automatically updated when databases
are opened. NOTE: Delete any DCBROW* index files and DCEDIT*
index files. They will be automatically recreated.

34. Needed a function that returns an array of all Aliases and
WorkAreas that have relations to the current work area. Added a
new function named DC_RELARRAY().

35. The Alt-= key in DC_BrowseDb() and DC_EditDb() is used to restore
the default (programmer's) menu. This key is enabled only if
no-one logs on with DC_UserLogin() or if a user logs in with a
Department named "PROGRAM".

36. DC_BLANK() did not COMMIT and UNLOCK record. Added a parameter,
(lCommit), default is .TRUE. This will COMMIT and UNLOCK the
record, otherwise it will remained locked after DC_Blank() is
called.

37. Added a new function to force dCLIP to not check the validity of
the DC_SetDclip() directory by using the File((directory)\NUL)
function. This always worked under every operating system in
the past but no longer works properly under Windows 95 ( on a
network ). If you get the error "INVALID DIRECTORY IN SET
DCLIP" during dCLIP initialization, then you need to put a call
to DC_CheckPath(.F.) at the start of any program that makes a
call to DC_Dot() or DC_Init().

38. Needed a new function and command for copying new files from the
network to a local drive if they have been updated. The intent
is to improve performance so file access to .EXE files and/or
dictionary files is from a local drive rather than a network
drive. Added a new function: DC_COPYNEW().
DC_COPYNEW( (cFromSpec), (cToSpec) ) -) lStatus . Only files in

39. DC_MenuMain() did not restrict User Access when a key was
assigned to a top-bar menu. Also, if a user was given NO keys,
he/she had access to everything. Now, only a user with the dept.
PROGRAM has access to everything.

40. Needed to added some new parameters to DC_IsStru() to find out
specifics about how the structure has changed so it can be
passed on to DC_StruUpdate() and use the fastest method of
appending old data. Added 4th and 5th parameters, (@lChangedType)
and (@lChangedName). These must be passed by reference. If any
field has changed type then (lChangedType) will be set to .TRUE.
If any field has changed name then (lChangedName) will be set
to .TRUE. This makes updates go much faster when a database is
opened with DC_DbFile() if fields have been added to the end of
the structure or if only the length of a field has changed.

41. MODIFY STRUCTURE now warns the user to use the FIELD EDITOR to
modify the structure of a database if the structure already
exists in DCFIELDS.DBF.

42. DC_Find() now automatically forces Upper Case into GET if index
contains 'UPPER('.

43. The SET PRINTER TO PRN or SET PRINTER TO LPT1 commands crash
Windows 95. dCLIP uses these in several functions, therefore
they have been modified for compatability with Windows 95.

44. Printing selected columns from DC_BrowseDb() errors if a column
is a "Virtual" column rather than a real field. Also, printing
to the display did not work properly.

45. The Vertical Scroll-bar on the DC_EditDb() Data-Entry screen now
scrolls the screen offset of the fields rather than the field
position within the Get list.

46. Some dCLIP users don't want the F1=HELP on Dialog Boxes. Place
a call in the start of your application to DC_READHELP(.f.).

47. DC_Query() would allow the saving of BAD Queries to the
DCQUERY.DBF database. Also needed the ability to overwrite a
query in the database and to pick other queries from a pick-list
to make it easier to build large queries from sets of small
queries.

48. Needed the ability to write better purging information for
browsing and reporting. Added a new parameter to DC_Purge(),
(cFieldName) which is the name of a numeric field in the database
being purged. This field is used to write a number from 0 to N.
If there are no duplicates, then a 0 will be written to the
record. If there ARE duplicates then a 1 will be written to the
RETAINED record and a number from 2 to N will be written to each
duplicate. New command syntax: PURGE ON (exp1) [TO (file)]
[RETAIN (exp2)] [MIN|MAX] [FIELD (field)]

49. Needed the ability to turn off the scroll-bar in DC_EditDb().
Now this is a menu selection under View-Window Options.

50. DC_AChoice() exited with a K_LEFT or K_RIGHT. This is the same
behavior as Achoice() but dCLIP customers didn't like it.

51. DC_BrowseDb() was not always passing the PROTECT flag to
DC_EditDb() thus allowing a protected browse to be defeated
during data-entry.

52. DC_FieldValidate() was not validating type 'PX' validations when
an Empty() value was entered into the field.

53. The SET APPEND MODE of DC_EditDb() and DC_BrowseDb() needed to
have a CARRY forward option to automatically carry forward the
data from the current record when adding a new record.

54. Needed ability to write a numeric value to a field to help the
process of purging records. Added a new paramter to DC_Purge(),
(cFieldName). This is the name of a "numeric" field in the
database being purged. A number from 0 to 9 will be written to
this field. 0 if no duplicates, or 1 - 9 if record is a
duplicate. New command syntax: PURGE [ON (expr)] [TO (file)]
[RETAIN (ret) [(max:MAX)] [(min:MIN)]] [FIELD (fld)]

55. Needed the ability to print the contents of a BROWSE or EDIT
Window.

56. Needed Conditional colors in DC_BrowseDb() and DC_EditDb().

57. Needed ability to call a different UDF for each work area in
DC_BrowseDb() and DC_EditDb().

58. DC_MenuEdit() would allow a menu to be saved with no name.
Also needed a new dot-prompt command: MENU CREATE [(menu name)]

59. MODIFY STRUCTURE now reindexes files.

60. Needed ability to "inherit" or "concatenate" other menus to make
it easier to build menu systems without redundancies. Also
needed ability to "conditional compile" menu items by evaluating
a code block. Also needed ability to traverse a menu and stuff
the name of the Accelerator key into the title.

61. Needed ability to cut and paste between gets. Added a new
function: DC_ReadCut((aKeys)) to assign the inkey value of the
Cut and Paste keys. Default is { 290, 275 } or Alt-G/Alt-R.
Now, you can go to a Get, press Alt-G to "grab" the value, then
go to another get later in the program and press Alt-R to
"stuff" the value into the current Get.

62. Needed ability to scope a group of fields on a data-entry screen
on the fly so only a specified sub-group will be edited and/or
displayed. Created two new functions: DC_EditCnd((aFields)) and
DC_EditWhen((aFields)). (aFields) is an array of field names
that is transferred to a static array in the DC_EditDb() function.
This array will be used to scope the field group and will
automatically be cleared when exiting DC_EditDb(). Use
DC_EditCnd() if you want to show only a specific group of fields
on the screen. Use DC_EditWhen() if you want to show all fields,
but only allow editing of a sub-group of fields.

63. Needed the ability to store "DEFAULT" menu selections for
top-bar and pull-down menus. The user should have the ability
to press a hot-key when highlighted on a menu item and this
action will automatically flag this selection as the "default".

a. A Unique 8-digit MENU_ID is assigned to every menu item in
the DCMENU.DBF menu dictionary.

b. A Database name DCMENUID.DBF/.NTX is checked for a link
between a Parent ID and a Child ID and this link establishes
the default value. This database does not need to be created
or maintained. It is automatically created if it does not
exist.

c. To "store" the default value for a pull-down menu, simply
press (Ctrl-U) when the menu selection is highlighted. To
change the storage hot-key use the function
DC_MenuIDKey((nInkeyVal)).

Each user is allowed to have his/her own menu defaults as they
are stored under the user's ID.

64. Needed to have an option to reverse the lock-system logic on
menu selections to automatically lock-out all users except
programmers unless they are assigned a valid ker unless an
asterisk (*) is assigned to the lock. Added a new function
named DC_MENULOCK( (lLockOut) ). (lLockOut) if .TRUE. will
lock-out all users. Default is .FALSE.

65. Needed ability to evaluate an expression as the header in
DC_BrowseDb() and DC_EditDb(). Now, if an & is placed at
the beginning of a heading it will be evaluated as an expression.


REVISION 4.02

dCLIP 4.02 - What's new?

Description:

Revision 4.02 Bug Fixes and/or additions

1. Needed ability to automatically open index files when using the
DBFNTX driver in the same way that a production index in
automatically opened when using the COMIX, DBFCDX or SIXCDX driver.
A new system setup variable name AUTOINDEX has been added. The
default is OFF. When set to ON then index files with the same
prefix as the Alias() and containing an index key that matches the
alias will automatically be opened with the USE command.

2. Needed a function and command to easily read or replace the value of any
element of a dCLIP array field. dCLIP array fields are essentially
character or memo fields in which an array is converted to a string
during storage and back to an array during retrieval. Added a new
function: DC_ArrayField( cFieldName, nElement, [xValue] ) -) xValue.
If (xValue) is passed, it will be stored into the contents of the
field.

3. Added function and command to easily convert .DBT memos to .FPT
memos when upgrading or switching a system from the DBFNTX driver
to the COMIX, DBFCDX, DBFCDXAX, or SIXCDX driver.
Added a new function named DC_Dbt2Fpt((cFileName|"ALL")) and a new
command named DBTCONVERT (cFileName|ALL).

4. Needed a command to display the current call stack from the dot
prompt. Added new command: STACK

5. Needed ability to overide "SHARED" setting in DCFILES.DBF when using
RESTORE WORK or DC_WorkRestore(). Added a 5th parameter
(lExclusive) to DC_WorkRestore(). The default is .FALSE. Added
an "EXCLUSIVE" optional clause to the RESTORE WORK command.

6. Needed ability to overide "INDEX ORDER" setting in DCFILES.DBF when
using DC_WorkRestore(). Added a 6th parameter (cTagName) to
DC_WorkRestore(). This may be passed as a character field
containing the "tag name" or as a numeric field containing the
"index order".

7. Added a new function, DC_MENULOCK( (lMode) ). This modifies the
behavior of the menu locking system. The default is .FALSE. In
this "normal" mode, all menu items are accessible by all users if
a menu item is not assigned a lock in the menu editor. If (lMode)
is .TRUE., then NO menu item will be accessible unless it is
assigned a lock or an asterisk (*) to make it accessible by
everyone.

8. Added ability to control what is displayed at the bottom of browse
and edit windows when saving Browse/Edit screens. Add a (2) or (3)
to the end of the description. See the instructions displayed in
the screen when saving configuration.

9. Added ability to remove all Field Descriptors from the data-entry
page by positioning them off the screen. New menu selection when
browsing Editing Field List with DC_FIELDEDIT().

10. Added a new feature to the DC_FILEEDIT() menu to clone a file group.

11. Added a fourth parameter to DC_MEMOBASE(). (lClearKeys) will clear
any existing SET KEYS to insure that they don't conflict with the
memo editing hot keys. .TRUE. is the default, so they will be
cleared if the parameter is not passed. Pass this as .FALSE. if
you want to keep your hot keys active.

12. DC_ODOMETER() will now return a NIL instead of a code-block if the
DC_ODPERCENT() is set to 0. This allows for the odometer to be
shut off on all database operations by simply calling
DC_ODPERCENT(0). The odometer can slow down operations on large
databases.

13. Added PRE Code block and POST Code block to a Type "D" Validation.

14. DC_PCHOICE() returns "PRN" if the user selects "PRINTER". If you
use this value as so:

cPrinter := DC_PCHOICE()
SET PRINTER TO (cPrinter)

This will crash Windows 95 because it is not compatible with the
following Clipper 5.2 commands: SET PRINTER TO LPT1 or
SET PRINTER TO PRN.

DC_PCHOICE() has been changed to return a null string if the user
selects "PRINTER".

15. Added a new function DC_MEMOCOPY() and a new command MEMO COPY.
This provides the ability to choose a memo field target and then
pick a memo field from either the same or another database to
insert, append or replace.

16. Added ability to DC_WorkRestore() and File Groups to define a new
time of item - FILE GROUP. This allows another File Group to be
referenced within a File Group. This feature prevents redundancy
and ambiguity by allowing the developer to create a file group
for each database and index set and then open a group of groups
by defining another file group full of group definitions.

17. Added a new type of object to the Screen Dictionary system -
ComboBox (type O). This is a GET with a pick-list.

18. Added a new function: DC_READWRAP( (lWrap) ). This function is
used to change the behavior of DC_READMODAL(). IF (lWrap) is
.TRUE. then pressing ENTER or the DOWN ARROW while in the last
GET will "wrap" to the first GET and pressing the UP ARROW while
in the first GET will "wrap" to the last GET.

19. Added a new feature to DC_READMODAL() to allow the passing of a
HELP CODE.

20. Added MESSAGES and HELP CODES to GET-type objects in the Screen
Dictionary System.

Added a new type of screen object - INHERIT SCREEN (Type I). This
allows another SCREEN to be called from within a screen.

Added a new type of screen object - HELP MESSAGE AREA (Type H).
This defines the screen coordinates for Help Messages attached to
GET objects.

21. Added an "I" type field validation to automatically add a new
number to a field in the database when adding a new record. This
validation will work in one of 2 modes:

1. Get the next number by going to the last record in the file
and incrementing the value from that value. Must specify a
controlling index for this mode.

2. Get the next number by specifying a Work Group in DCFILES.DBF
where the number is stored. See DC_FILELNUM().

22. MODI STRU, DC_ModStru(), FIELD EDIT and DC_FieldEdit() now allow the
user to reopen the database in EXCLUSIVE mode "on the fly" rather
than kicking you out of the update program if the file has not been
used exclusive. They also prompt the user that the update may take
a long time if a field name or field type has been changed.

23. Push-Button type objects in the SCREEN DICTIONARY system now support
a High-Light character for a "Hot-Key" character.

24. Improved Printer Driver editor and DCPRINT.DBF to add support for
approximately 1000 more printers and 30 chars/per code sequence.

25. Added a new 12th parameter, (cHotKey), to DC_MSGBOX() to return the
value of the high-lighted letter in the selected menu item when
using DC_MSGBOX() with an array of menu items. This must be a
variable, passed by reference, in which to store a character value.

26. Needed the ability to disable keys in the Browse system -
DC_BROWSEDB(). Added a new function, DC_BROWKDIS( (aKeyDisable) ).
Pass this function an array of numeric INKEY() values to disable
keys that are normally active while in the Browse loop.

27. Needed the ability to disable keys in the Edit system (DC_EDITDB()).
Added a new function, DC_EDITKDIS( (aKeyDisable) ). Pass this
function an array of numeric INKEY() values to disable keys that
are normally active while in the Edit loop.

28. DC_EditDb() now supports code blocks in the WHEN clause and the
DISPLAY CONDITION clause.

29. Added a new validation ( type - B ) for use with data-entry screens.
This "Branch" validation allows for calling another page of fields
during data-entry and then returning to the next field of the
calling page after all fields in the called page are visited.

30. Added a new function - DC_XTOC(). This function converts any value
to a character string.

31. Menus may now "Inherit" other menus at the sub-menu level. To
inherit another menu as a sub-menu, enter the name of the menu to
inherit in quotes instead of a code-block to evaluate. This allows
menu systems to be created "modularly" and helps eliminate
redundancies.

32. DC_Gateway() didn't use Blinker's SWPRUNCMD() if linked in
protected mode. Instead it used the Clipper RUN command.

33. Added a new function, DC_EDITREV(). This function is used to
enable the automatic updating of six (6) fields in each database
record whenever a record is added or edited.

34. Added a new validation ( type - E ) for use with data-entry screens
and Browse screens. This "Evaluate CASE" validation is similar to
a type "F" (formula) validation except that it is evaluated "every
time" any other field in the current record is updated. An "E"
validation can consist of up to 10 cases (logical expressions) that
match to an expression which returns the same type as the field
being evaluated. The "first" case that evaluates .TRUE. will write
the associated output expression to the database field.

35. Added a new dot-prompt command: LOGIN. This command preprocesses
to call the DC_USERLOGIN() function.

36. Added 3 new "user" fields to the Code Table system, so data can
easily be extracted from a code table via the DC_CODEGET() function.
The "definition" of the three fields is established under the
"options" for the code table.

37. Added new parameters to DC_CODEGET() to make it easier to extract
individual code data from a code table.

38. Added a ninth (9th) parameter, (lCMXAutoOpen) to DC_USEAREA() to
override the "auto-open" feature of the "COMIX" and "FORTRESS" data
drivers. Passing a .FALSE. (default is .TRUE) will force the
COMIX/FORTRESS driver to NOT open any associated *.CDX index file.

39. Added the ability to assign "Page 0" to an object or set of objects
in a screen group. Any object assigned as Page 0 will be painted
along with the page requested when using DC_SCRNPAINT(). This
allows for a "common" set of objects to be painted on each page of
a dialog screen or as a background to each page of a data-entry
screen.

40. Added the ability to assign "Page 0" to a field or set of fields
in a data-entry screen. Any field assigned to Page 0 will be
painted along with the fields in the page requested when using
DC_EDITDB(). This allows for a "common" set of fields to be
painted on each page of a data-entry screen.

41. Added the ability to assign a "name" to each "page" of a data-entry
screen. Press Alt - (Alt minus) to pop-up a list of pages, then
select the page and press F2 to edit the parameters for that page.

42. DC_BrowSave(), DC_EditSave(), DC_MenuSave() now allow for
"Exporting" to DXBROWSE.*, DXEDIT.*, DXMENU.* files respectively,
in a specified directory and with a specified RDD. For example,
this allows for exporting from a system in which the dCLIP
dictionaries are "COMIX" files to a system in which the dCLIP
dictionaries are "DBFNTX" files.

43. Added the ability to replicate a set of pushbuttons in columns and
rows in the Screen designer. Also added an optional "shadow" to the
pushbuttons.

44. Added the ability to add pushbuttons to a data-entry screen.

45. Added the ability to control the behavior of the ENTER key when
in Data Entry (DC_EditDb(). A new menu selection (EDIT OPTION)
calls a dialog screen (also callable by _DCEDIT2_E('SE')) which
allows the following selections:

N - No Action - Disables ENTER key editing.
E - Normal Edit
{ - Enter a Code Block. The code block must return a logical value.
.T. allows editing, .F. disables editing.

46. Added a new parameter to DC_KEYSAVE(), (aKeySet). This is an
optional array of keys to save and must include valid INKEY()
values. If no array is passed, all keys from -47 to 421 will be
saved.

47. Added a better way to drop fields onto a data-entry page. The ALT-;
key will now pop up the field list and ADD the field to the current
page. When using this feature, it's a good idea to start with no
fields at all.

48. Added a set of CGI functions for handling CGI requests from a Web
Server. These functions are compatable with DOS CGI standards.
With these functions, the dCLIP engine (or library) can be used as
a forms or query processor for HTML Web Pages. This code has been
tested with Website 1.1g. (http://www.ora.com)

49. Added new function: DC_ACOMPARE( aArray1, aArray2 ) -) lStatus.
Returns a logical .TRUE. if the arrays are exactly identical.

50. Added automatic scanning to DC_Achoice(). Now pressing a sequence
of keys will scan to the desired choice.

51. Added new function and command to make importing files easier.

DC_MenuImp( (cMenuName | "ALL") ) or MENU IMPORT [(file) | ALL]
DC_CodeImp( (cCodeTable | "ALL") ) or CODE IMPORT [(file) | ALL]
DC_BrowImp( (cBrowName | "ALL") ) or BROWSE IMPORT [(file) | ALL]
DC_EditImp( (cEditName | "ALL") ) or EDIT IMPORT [(file) | ALL]
DC_FileImp( (cFileGroup | "ALL") ) or FILE IMPORT [(file) | ALL]
DC_FieldImp( (cFieldGroup | "ALL") ) or FIELD IMPORT [(file) | ALL]

52. Added new function and command for deleting a menu from the
DCMENU.DBF menu dictionary.

DC_MenuDel( [(cMenuName)] ) or MENU DELETE [(cMenuName)]

53. Added COMIX, FORTRESS and Advantage server support to DC_KeyNo()
and DC_KeyCount().

54. Record tagging functions: DC_RECTAG(), DC_RECTAGTOGGLE(), etc., now
support a new feature. If a logical field named TAG exists in the
current data base, it will be used in lieu of the Tag Array.

55. Added a new Function: DC_FOXRDD(). This function returns the name
of the best RDD to use for .CDX compatability only if the RDD has
been linked into the program and is usable on the Default drive.

56. DC_editdb() automatically creates a DCTRANS.DBF database when
calling DC_TRANSACTION(). Now DC_TRANSACTION() is disabled
by default unless enabled with DC_TRANENABLE(.t.) or if a
DCTRANS.DBF file already exists.

57. Added a new "FAX SERVER" system to dCLIP. This requires FAXUAL2
or later. The fax server works with a database named DCFAX.DBF
and automatically processes faxes in this database when the
DC_FAX() function is executed. DC_FAX() stays in a loop and
looks for new entries into DCFAX.DBF.

58. Added a new function: DC_TEXTMERGE().

This function is used to merge ASCII text with data by using a
special format within the text to determine the merging.

59. Added ability to COPY a field group to a new field group.

60. Added ability to COPY a browse configuration to another alias.

61. Added ability to COPY an edit configuration to another alias.

62. Added built-in command support for Advantage Server:

BEGIN TRANSACTION
COMMIT TRANSACTION
ROLLBACK TRANSACTION
SET PASSWORD
SET RIGHTS CHECKING
SET EXPRESSION ENGINE
SET AXS LOCKING
INDEX ON .. [CUSTOM]
USE/AUTOUSE .. [PASSWORD ..] [ALTERNATE (altrdd)]

63. Added a new parameter (array element 22) to (aOptions) argument of
DC_BROWSEDB(). This is a logical value that is used to override
any setting of AUTOSEEK mode that was saved in the browse
configuration.

64. Added a new function, DC_TEXTBROW(). This function is used to
browse text files that are larger than 64k. DC_MEMOBASE() has
also been modified to support browsing of text that is larger
than 64k by breaking the text into 60k segments, storing the
segments into an array, and passing the array to DC_MEMOBASE()
instead of the text string. DC_MEMOBASE() is used as the text
browser. To go to the next or previous pages of text use the
Alt-PgDn/Alt-PgUp keys.

65. Column totalling system now provides toggling of column totals
ON/OFF with Alt-T.

66. Added a new function: DC_DictImp(). This function will import all
DX*.DBF files into data dictionaries. The directory established
by DC_SetDclip() will be used to look for the Import dictionaries
and the standard dictionaries.

67. Added a new function: DC_DictExp(). This function is used to set
a flag to automatically export changes to DX* files at the same
time they are saved to the associated DC* file.

68. Added two new functions to save and restore work areas.

aWork := DC_DATASAVE() will store all work area info to an array.
DC_DATAREST(aWork) will reopen all databases, indexes and relations
from the array created by DC_DATASAVE(). This function is handy
when it is necessary to insure that database work areas are
restored to their original condition after calling a routine that
may close files, open files, select different indexes or clobber
relations.

69. Added a new parameter to DC_VIRTCAPTURE(). If a logical .T. is
passed as the first parameter, then the field name data will be
saved in the array returned. DC_VIRTREPLACE() will automatically
know if the field data information is in the array and will not
cause an error if the structure of the target database is not the
same as the structure of the primary database.

79. Added a new function: DC_BIGCLOCK(). This function displays a
large digital clock in military time until a key is pressed or
the mouse is clicked.


REVISION 4.1

dCLIP 4.1 - What's New?

Description:

Revision 4.1 Bug Fixes and/or additions

1. Added a new function, DC_STOD() for converting DTOS() style date
strings to a date type variable.

Syntax: DC_STOD( (cString) ) -) dDate

2. Validating with a type "D" or "V" could cause EOF() condition if
pick-list is choosing from the same database as the data being
validated and the ESCAPE key is hit.

3. Totals at the bottom of columns did not use the same picture clause
as the actual column.

4. Needed to add a GO RECNO() after updating a field in DC_EditDb()
to force relational pointers to be updated.

5. Added ability to define a browse column picture clause. Default is
currently established in the field dictionary.

6. The UNIQUE setting for indexes was not getting saved to DCFILES.DBF
dictionary.

7. Calling DC_NumIncr() with an empty first parameter could create
an error.

8. Importing a menu from DXMENU.DBF using DC_DictImp() overwrites current
menu access code (security) information in existing menu. Needed
to insure that access codes are retained from old menu.

9. Browse and Edit Virtual Field Equations were truncated to 100 bytes
due to field length in DCBROWSE and DCEDIT dictionaries.
Needed to increase field length of BROW_FLD and EDIT_FLD to 200 bytes.

10. Needed a new function to return the name of the current BROWSE
configuration for a selected alias. Added new function
DC_BROWNAME((cAlias)).

11. Needed a new function to return the name of the current EDIT
configuration for a selected alias. Added new function
DC_EDITNAME((cAlias)).

12. The mechanism for creating relational browse/edit windows was unreliable
and difficult to understand. The browse/edit systems contain a flag
which determines whether or not browse/edit windows for relational work
areas should be updated whenever the parent window is updated or
the record pointer moved. When this flag was on, all work areas
that had a relation to the parent were updated even if the programmer
did not want them to be. Also, the configurations for each work
area were saved under one (1) browse or edit configuration name, thereby
making the design of the data-dictionary more cumbersome and convuluted.

After some new thought and consideration (generated by customer
requirements), it was determined that browse and edit window relations
should not be determined by preset database relations but instead
there should be a method to attach relations between windows regardless
of the state of the work areas. The SAVE CONFIGURATION dialogue now
allows a list of relational windows to be entered. Each window must
be created separately and saved with a unique name which can later
be attached to other windows via the "Related Browses" or
"Related Edits" entry. NOTE: existing browse/edit configurations
will not be affected by this change, however, when saving configurations
it will now be necessary to save each window separately and attach
them via the list.

This new system makes it much easier to handle many-to-many browse
relations where there is a linking file between two work areas
and it is not desired to browse the "child" linking file but only
the "parent" and the "grandchild".

13. Added some extra functionality to a type "T" - Table Lookup validation.
Previously, whenever a "T" validation was attached to a field, the
contents of the field was replaced by the selected table item. Now,
the option is provided to treat the field as a Tokenized List and
drop the selected item at the end of the list preceded by a selected
delimiter.

14. Needed a function for looking up data from another workarea.
Created DC_LOOKUP() to be used as a function for creating virtual
fields in browse and edit screens that return data from another
work area.

Syntax: DC_LOOKUP ( cAlias, cTagName, cExpression|bCodeBlock, ;
xSeekValue, xDefault ) -) xReturnValue

(cAlias) is the Alias of the workarea to lookup.
(cTagName) is the Index Tag name to select in the (cAlias) workarea.
(cExpression|bCodeBlock) is an expression or code block to evaluate
for returning a value.
(xSeekValue) is the value to seek into the lookup database.
(xDefault) is the value to return if the database is not opened or
the index cannot be selected.


15. Range Queries in DC_BrowseDb() did not work on Descending indexes.

16. The FLD_VALID field in the DCFIELDS.DBF dictionary was insufficient
length to handle complex forumulas. Increased length from 300 to 500.

17. DC_TagDelete() did not work with Advantage Server's DBFCDXAX driver.

18. Advantage Driver crashes when calling Query Builder.

19. Added a new flag that modifies the behavior of DC_MsgBox(). A new
function named DC_MsgBoxYesNo() is used to get or set the flag
that enables "Yes/No" style message boxes, using DC_MsgBox() to
be displayed in RED if the default is is 'NO' and GREEN if the
default is 'YES'.

20. DC_Blank() could sometimes cause 650 errors under COMIX and 7017
errors under Advantage server. We believe this was due to the
use of COMMIT. It has now been disabled under COMIX and AXS.

21. Added new function DC_AutoSeek(). This function is used to set
the default for AUTOSEEK mode in DC_BrowseDb() and DC_EditDb()
when creating a new browse or edit configuration.

Syntax: DC_AutoSeek( (lMode) ) -) lOldMode

22. Fixed bug that caused TOTAL flag in DC_BrowseDb() to turn on after
editing a column with ALT-F2. Fixed bug that caused Browse screen
not be be refreshed properly after editing a column with ALT-F2.

23. Added a new command KEY IMPORT and a new function DC_KeyImport()
to import a key group from the DXKEY.DBF dictionary to the
DCKEY.DBF dictionary.

Syntax: KEY IMPORT [(group)|ALL]
DC_KeyImport( [(group)|ALL])

24. Added a new function DC_ERRORBLOCK(). This function is used in
place of ERRORBLOCK() when it is necessary to disable temporary
error handlers in an application. This becomes especially
necessary in CGI applications where the Clipper program is being
run by a Web Server on an NT server and temporary error handlers
disable the default error handler needed to route error output
to the remote browser.

Example:

* Start of CGI program
ErrorBlock({|e|DC_CGIError(e)} // Initialize the dCLIP CGI error handler
DC_Errorblock(nil,.T.) // Disable all other error handlers

Note: For this to work, you must changes calls in your code from
ERRORBLOCK() to DC_ERRORBLOCK() when posting a new error handler.

Was:

bOldError := ErrorBlock()

Is:

bOldError := DC_ErrorBlock()

Added to _DCERROR.PRG, DCFIX402.LIB
Updated _DCUSE.PRG, _DCDBFIL.PRG

25. Added two new parameters to DC_READCLICK(). A fifth parameter,
(lAppend) and a sixth parameter, (cDelim) have been added to allow the
option of DC_ReadClick() "appending" the value to the existing GET
rather than "replacing" the value in the existing GET.

(lAppend) - A logical .TRUE. will append the picked value to the
GET. Default is false.

(cDelim) - The delimiter character(s) to place at the end of the list.

26. Added a new function - DC_FINDFAST() and a new command - FINDFAST / FF.
This function is used to search the current work area for any text
within the database (except memos) using low-level scan of the database.
This type of search is about 10 - 50 times faster than a LOCATE.

Syntax: DC_FINDFAST( [(cString)], [(lCaseSens)], [(lContinue)], [(lBox)] )

FINDFAST [(cString)] CASE
FF [(cString)] CASE
FINDFAST CONTINUE
FF CONTINUE

(cString) is the string to search.

(lCaseSens) if .TRUE. will search Case Sensitive, otherwise all
posibilities will be search. Default is .FALSE.

(lContinue) if .TRUE. will continue from the location of the last
found record. Default is .FALSE.

(lBox) if .TRUE. will display a dialog screen for entry of parameters.
Default is .FALSE. unless (cString) is empty.

Returns: The record number of the text (if found), otherwise returns 0.

Added to _DCFAST.PRG, DCFIX402.LIB

27. Added a new parameter to DC_InkeyEval(). DC_Inkey() now passes the
Inkey() value of the key pressed to the code block posted to
DC_InkeyEval().

28. Added a new label printing system.

New functions: DC_Label() and DC_LabelAdd()
New commands: LABEL [PRINT]

DC_Label() manages a database named DCLABEL.DBF. The database stores
the label information and the manager provides editing and printing
options. Use this system for printing disk labels, address labels,
etc, including the automatic incrementing of serial numbers. If
DCLABEL.DBF does not exist, it will be created.

DC_LabelAdd() is a handy function which can be used in an application
for adding labels to the DCLABEL.DBF file.

Syntax: DC_LabelAdd( aParams )

aParams is an 11-element array.
1 - 6 (Character) are Line 1 through Line 6 of text
7 (Numeric) is the left print margin
8 (Numeric) is the number of lines between start of each label
9 (Character) is the category code
10 (Numeric) is the number of labels to print for this record
11 (Character) is the title of the label.

Returns: .t. - if label added to file, .f. if label not added to file

Added to _DCLABEL.PRG, DCFIX402.LIB


29. DC_Pack() will now reopen the file in EXCLUSIVE mode if the file
is opened in SHARED mode or READONLY mode.

30. Added a new BarCode printing function, DC_BARPRINT(). This function
supports printing of 3-of-9 barcodes on HP LaserJet printers and
Epson/IBM graphics dot-matrix printers.

Syntax: DC_BarPrint ( lLaser, cData, nMode, nQty, nRows, nCols, ;
nMargin, [cText1], [cText2] )

(lLaser) - Logical .T. if printing to Laser printer, .F. (default) if
printing to dot-matrix printer.

(cData) - This is the data to print as a bar code.

(nMode) - This is a number from 0 - 7 used to select the density
of the bar code;

0 - 480 dots/line
1 - 960 dots/line (DEFAULT)
2 - 960 dots/line (double speed)
3 - 1920 dots/line
4 - 640 dots/line
5 - 576 dots/line
6 - 720 dots/line
7 - 1152 dots/line

(nQty) - Quantity of bar codes to print.

(nRows) - Number of print rows (bar code height). Default is 2.

(nCols) - Number of columns

(nMargin) - The left print margin (in bar code line width).
Default is 15.

(cText1) - Line of text to print to right side of bar code.

(cText2) - Second line of text to print to right side of bar code.

Added to _DCBARC.PRG, DCFIX402.LIB

31. Fixed a regression in the pre-processor created in the initial release
of 4.02. Commands with TO PRINT as the target no longer worked.

32. Added a new EDIT OPTION to the EDIT system (DC_EditDb()). A character
"M" placed in the EDIT OPTIONS list in the edit properties screen
will change the behavior of memo editing. If no "M" is entered
(default), the edit mode will be turned off when entering a memo
field and the next ENTER key will pop-up the memo editor. If an "M"
is entered, the edit mode will no be turned off, but instead a down
arrow will appear at the end of the "MEMO" get and CONTROL-ENTER
will pop-up the memo editor.

33. Added a new EDIT OPTION to the EDIT system (DC_EditDb()). A character
"1" thru "9" placed in the EDIT OPTIONS list in the edit properties
screen for a specified field will cause the editing to continue at
the selected PAGE (1 thru 9).

34. Some commands did not work properly with the TO PRINT clause.n

35. MODIFY STRUCTURE caused records marked for deletion to be removed from
the database (same as pack).

36. Added a new function DC_BigClock(). This function displays a digital
clock with large characters.

Syntax: DC_BigClock ( nStRow, nStCol, cColor )

37. Added a new function DC_BigChar(). This function displays large
characters on the screen.

Syntax: DC_BigChar ( nRow, nCol, cChar, cColor )

Added to _DCCHR.PRG, DCFIX402.TXT

38. Added the ability to add a LOCK to a menu item while in the menu
(on the fly). Press CTRL-K when on a menu item to assign a lock.

39. MODIFY STRUCTURE (dc_struupdate()) now updates much faster when using
production (.CDX) type indexes. The old process used the new file
with the old index, thereby slowing the update process. The new
process deletes the old index, modifies the structure, then recreates
the index. MUCH FASTER!

40. DC_Inkey() caused excessive processor usage on NT systems only.
Windows 95 and OS/2 didn't have the problem.

41. DC_Say() doesn't work properly when Saved screen is an array.

42. DC_IniLoad() would not properly initialize logical values if
they are not entered in upper case.
This works: (name)=YES
This doesn't work: (name)=Yes

43. Added new function: DC_Sec2Time(). This function is used to convert
seconds after midnight (in the form returned by SECONDS()) to a time
string (in the form returned by TIME()).

Syntax : DC_Sec2Time( nSeconds ) -) cTimeString

44. Added a new function: DC_GMT(). This function is used to return the
Greenwich Mean Time as a time string.

Syntax: DC_GMT ( (nOffset), [@(nSeconds)], [@(dDate)] ) -) cTimeString

(nOffset) is the offset (in seconds) from Greenwich Mean Time.
For example, the offset for Mountain Standard Time is -25200 seconds
(-7 hours). If no (nOffset) parameter is passed, an environment variable
name GMT_OFFSET is tested for a value. Set this to the value for your
time zone: Example : SET GMT_OFFSET=-25200

The seconds in England (GMT) will be returned in the variable (nSeconds)
when it is passed by reference.

The date in England (GMT) will be returned in the variable (dDate)
when it is passed by reference.

45. Increased length of LOCK field in Menu dictionary to 5 digits.

46. Added ability to add a LOCK to code tables. This allows users with
a key to the specified lock to add items to the code table on the fly.

47. Added several indexes to the DCQUERY.DBF database.

48. DC_BrowRestore() fails to load custom browses by USER ID if a .DBR
file exists with the browse configuration.

49. The SCREEN dictionary (DCSCRN.DBF) could not store variable names
with Aliases. Needed to be increased in length to 22 characters.

50. Added the ability to add a LOCK to a field while in the data entry
screen (on the fly). Press CTRL-K when on field to assign a lock.

51. DC_DictImp() would only import the first item in each dictionary.

52. DC_VirtReplace() would not replace array fields if the virtual array
was saved with DC_VirtCapture(.t.). This bug caused corruption of
imported browse and edit configurations.

53. DC_BrowseDb() causes an error if a DCBROWSE.DBF dictionary does not
exist. This is a regression in an earlier fix.

54. Added a new function: DC_HTMURL2DBF(). This is a utility program
that scans a set of HTML files and produces a URL report in the
form of a database. In the first pass, every reference to URLs and
IMAGEs in every HTML file is placed in the database. In the second
pass, every URL and IMAGE is tested for validity. Image files are
tested to insure that they exist and relative URLs are tested to
insure that they exist in other HTML files.

The following error codes are written to the database:

0 - No error, URL or IMAGE is ok.
1 - HTML file or IMAGE file does not exist.
2 - HTML "Name Tag" does not exist.
3 - HTML File is not called by any other HTML file.
10 - Cannot test validity of URL because it is remote.
11 - Cannot test validity of URL because it calls a CGI program.

The data is written to a database named DCWEBURL.DBF.

Syntax: DC_HtmlURL2Dbf( [(cWildCard)] ) -) lStatus

(cWildCard) is the extension of the files to scan. Default is *.HTM.

55. Added a new function: DC_HTMTABLE(). This is a utility program
that scans an HTML file and produces a file named TABLE.TXT. The
output file contains an "indented" report that helps in debugging
problems with tables in HTML files. The most common table problems
are those in which missing tags in the HTML code cause the tables
to display incorrectly, such as (/TD), (/TR) or (/TABLE).
The report aligns the starting and ending of table tags in a text
file that can be viewed with an editor. Every table tag is written
with the appropriate ending tag aligned directly under the starting
tag and with the appropriate line number. Misalignment will point
to the line of code that is probably in error.

Syntax: DC_HTMTable( cHtmlFile ) -) lStatus

(cHtmlFile) is the name of the HTML file to scan.

56. Changed the behavior of DC_Zap() and the ZAP command to correct an
incompatability problem with Clipper 5.3b. Files ZAPPED by a Clipper
5.2e program (using the DBFCDX or COMIX) driver are not compatible
with Clipper 5.3b and cause a GPF when the file is opened by the
Clipper 5.3b program. This is a bug in Clipper 5.3b, however a
workaround was put in dCLIP to force a write to the memo file,
then pack it after the ZAP to fix the problem.

57. Corrected a bug that improperly displays data in the last character
in the edit screen if the length of the field is longer than the
display width (during edit mode). No data was affected. This was
a visual problem only.

58. The starting HTML page is missing from DCHTML.ZIP (the HTML version
of the dCLIP documentation). It is included here in DCFIX402.ZIP

Added DCHELP.HTM

59. Fixed a variety of problems related to compatibility with the SIXNTX
driver of SuccessWare (thanks to the contribution of Stefan Kursawe).

60. MENU EDITOR allows a menu with no name to be saved to Menu Dictionary.

61. Added a new function DC_WEBLOGOREILLY(). This function creates a
database named DCWEBLOG.DBF from the contents of a WebSite log.

Syntax: DC_WebLogOreilly( cLogName ) -) lStatus

62. Added the ability to enter multiple commands on the command line
(separated by semi-colons).

Ex: FOR i := 1 TO 10 ; ? i ; NEXT

63. Advantage Server changed the way AX_TagInfo() returns array info
in version 4.4, so it causes DC_IsUnique() and DC_IsDescend() to
crash. Added a check for the version of Advantage to correct
problem.

64. Opening files can be very slow when SET DEFAULT is a mapped NT
drive that is a root directory. Problem was in DC_PathFound().

65. Added a new menu selection to DC_Help() for creating Windows .HLP
file source code. Now you can create .NG, .HTML or .RTF source code
for building any type of help system from the DCHELP.* database.

66. A WHEN clause in an edit field causes DC_EditDb() to exit on the
WHEN claused field when in Edit-Exit mode.

67. Blow-Down doesn't work in DC_BrowseDb() if capturing numeric value
of 0 or a logical value of .FALSE.

68. Added more programmer control over the behavior of DC_ReadDPick()
when using a (bPreBlock) and/or a (bPostBlock).

Updated documentation:

(bPreBlock) is a code block to evaluate before popping up the
pick-list. (xValue) is passed as a parameter to the code
block. The code block may return a numeric value to control
the continuing behavior of the function. If the code block
returns a numerical 1, then the picklist will not be displayed
and DC_ReadDPick() will return a logical .FALSE. If the code
block returns a numerical 2, then the picklist will not be
displayed and DC_ReadDPick() will return a logical .TRUE. If
the codeblock returns any other value, the picklist will be
displayed.

(bPostBlock) is a code block to evaluate after the pick-list
has been displayed and the user selects a record or presses
ESCAPE. (xValue) is passed as a parameter to the code
block. The code block may return a numeric value to control
the return value of the function. If the code block returns a
numerical 1, then DC_ReadDPick() will return a logical .FALSE.
If the code block returns a numerical 2, then DC_ReadDPick()
will return a logical .TRUE. If the codeblock returns a logical
value then the logical value will be returned. If the codeblock
returns any other value, a logical .TRUE. will be returned.

(bPreBlock) and (bPostBlock) are optional parameters and may
be used for such functions as opening and closing the database,
setting filters and or indexes, etc. in the event that the
database is not already open or the database conditions are
unknown.

69. Added more programmer control over the behavior of a Database
pick-list validation in the data-entry system as invoked by
DC_FieldValidate() when using a (bPreBlock) and/or a (bPostBlock).

DC_FieldValidate() will now return the same value as
DC_ReadDPick(). See item 68 above.

70. Added new function DC_TEXTFIND(). This function searches a set of
text files for a matching string and writes the output to a file or
the screen.

Syntax: DC_TEXTFIND( (cWildCard), (cSearchString), (lCaseSens), (cOutPut) )

TEXTFIND (cSearchstring) [WILDCARD (cWildCard)] [CASESENSITIVE] ;
[TO (cOutPut)]

71. DC_Replace() allows fields to be chosen from work areas other than
current work area. This causes a syntax error.

72. Added new function DC_INKEYWAIT((nWait)). This function sets the amount
of time DC_Inkey() waits in the loop. The default is .1. Set (nWait) to
.01 for faster repsonse of the mouse system. The value of .1 was chosen
for best performance on multi-user application servers such as Winframe,
MetaFrame, and Microsoft Terminal Server.

73. Added a second parameter to DC_ReadNav() to allow it to be disabled.
DC_ReadNav( nil, .t. ) will disable the Alternate Navigation mode
that can be toggled with ALT-N when in a GET.



WHAT'S HOT?

What's the HOT NEW STUFF in dCLIP 4.1

Description:

--- INTERNET FUNCTIONS ---

The dCLIP libraries now support a suite of functions for creating
CGI (COMMON GATEWAY INTERFACE applications for the World Wide
Web and Intranets. These functions all start with DC_CGI*().
To see what you can do with these functions check out the
following Web-Sites:

http://www.seedsblum.com - A Garden Seed ordering system
http://www.pactweb.com - A Psychologists Listing Service
http://www.boiseconnector.com - A Phone Book and Event Calendar
http://www.dclip.com - A Web BBS system (in development)

All of these sites access databases via a Clipper application
that uses DC_CGI*() functions to talk to the Web Server. Some of
the applications use FoxPro compatible databases accessed via
COMIX or Advantage Server and other use Standard Clipper
databases.

--- FAX SERVER ---

The dCLIP libraries now support a set of functions that are a
front-end to FAXUAL-II (a third-party product). With dCLIP 4.02
and FAXUAL-II you can now easily process batches of faxes by
simply starting up the Fax Server ( DC_FAX() ) and then writing
records to DCFAXIN.DBF. Several DC_Fax*() functions make it
easy to merge data with text information and send it by fax.

-- IMPROVED SUPPORT FOR ADVANTAGE SERVER --

Advantage Database Server has become so popular with dCLIP
customers that version 4.02 now includes all custom AXS commands
"built-in" to run at the dot-prompt.

BEGIN TRANSACTION
COMMIT TRANSACTION
ROLLBACK TRANSACTION
SET PASSWORD
SET RIGHTS CHECKING
SET EXPRESSION ENGINE
SET AXS LOCKING
INDEX ON .. [CUSTOM]
USE/AUTOUSE .. [PASSWORD ..] [ALTERNATE (altrdd)]





COMPUTER

Computer System Requirements

Description:

dCLIP requires that you have an IBM-PC, XT, AT, 386, 486,
PS-2 or 100% IBM-PC compatible computer. The computer must
include the following features:

* PC-DOS or MS-DOS version 2.0 or greater for single-user
applications.

* PC-DOS or MS-DOS version 3.1 or greater for network
applications.

* 640k or more, of Random Access Memory (RAM).

* 1 diskette drive and 1 hard disk drive.


-- Recommendations --

Development using dCLIP requires the same considerations
for speed and memory as developing Clipper 5.01 / 5.2
applications without dCLIP. If you are already exper-
iencing speed or memory problems then you will probably
continue to do so with dCLIP, however development will
still be much faster. Time is always your most valuable
resource and you purchased dCLIP to help you save time,
therefore it is incumbent upon us to make other recommen-
dations to help you program more effectively. The follow-
ing minimum features are recommended when programming in
dCLIP and/or Clipper for reasonable performance:

* 386, 386-SX, 486, 486-SX microprocessor
* Hard disk with 28ms (or better) access time.
* 1 meg DOS memory (640K plus Upper Memory Blocks - UMB)
* DOS 5.0 or Expanded Memory Manager
* 1 meg (or more) Expanded Memory
* 500k extended or expanded memory (set up as RAM DISK)
* A disk-cache system
* VGA Color or Gray-Scale monitor
* Microsoft-compatible mouse (optional)

SOFTWARE

Other Software Required

Description:

-- CLIPPER 5.2 or 5.3 --

The dCLIP-4.0 "dynamic-linker" runs object (.OBJ) code
that has been compiled by the Clipper 5.2 or 5.3
compiler, therefore to be used as a developer's or pro-
grammer's aid it is recommended that you own a copy of
Clipper.

If you are using dCLIP as a DBMS (Database Manager) only
or are running application code that has already been
compiled into .OBJ files or dynamic-libraries, then there
is no other software required to run Clipper-compiled
applications or dCLIP-interpreted applications.


-- SOURCE CODE EDITOR --

dCLIP's IDE interface is designed to work with any editor
which allows access to a specified line of code, such as
the QEDIT (tm) editor from Semware, BRIEF from SoftLogic,
Inc., or MULTI-EDIT from ***************.

All editors which allow access to a specified line number
in a file use a different syntax, therefore it is recom-
mended that you use a batch (.BAT) file to interface
between dCLIP and your editor.

dCLIP's EDIT command and other automatic turbo-style
commands will pass parameters as follows:

. EDIT (program) (line number)

a. Example 1 - Using dCLIP with QEDIT

To go directly to a specified line number with QEDIT,
you must call the program as follows:

Q (file name) -n(line number)

To insure that dCLIP is compatible with QEDIT, you must
use an intermediate batch file named Q2.BAT with the
following commands:

@ECHO OFF
@IF '%2'=='' Q %1
@IF NOT '%2'=='' Q %1 -n%2

To finish the QEDIT installation, include the following
commands in your DCLIP.SYS file:

COMMAND=Q,Q2,128,C:
EDITOR=Q2,128,C:
TURBO=Q2,90,C:

b. Example 2 - Using dCLIP with BRIEF

To go directly to a specified line number with BRIEF, you
must call the program as follows:

B (file name) -m"goto_line (line number)"

To insure that dCLIP is compatible with BRIEF, you must
use an intermediate batch file named B2.BAT with the
following commands:

@IF '%2'ÍÍ'' B %1
@IF NOT '%2'ÍÍ'' B %1 -m"goto_line %2")nul

To finish the BRIEF installation, include the following
commands in your DCLIP.SYS file:

COMMAND=B,B2,360,C:
EDITOR=B2,360,C:
TURBO=B2,256,C:

SOFTWARE

Other Software Recommended

Description:

-- BLINKER --

When using many third-party libraries written in C or ASM
in a dCLIP engine, the overlaying capabilities of Blinker
provide the best memory model and the simplest method of
integrating the libraries into dCLIP. The 3RDPARTY.EXE
file contains many ready-to-use link scripts for creating
custom engines with other third-party products. The
Rtlink linker supplied with Clipper can also be used to
create custom engines but the process is much more
cumbersome and support files are not provided due to the
difficulty in integrating more than one product into an
engine.

dCLIP will work with Blinker version 1.5 or later, however
it is recommended that you use 3.2 or later for best
results.

SPECIFICATIONS

Technical Specifications

Description:

dCLIP is essentially a Clipper application program,
therefore it complies with the same specifications as
applications that are created by the Clipper compiler and
linked with the Clipper libraries.

See your Clipper documentation for more information on
application program specifications.

Additional specifications:

Maximum number of dynamic libraries in use - 10
Maximum object file size for dynamic linker - 64K
Minimum DOS memory to run DCLIP.EXE engine - 550k

COMMAND LINE ARGS

Running dCLIP with Command-Line Arguments

Syntax:



Arguments:

    (cCommand) is the command line to interpret and execute.
   

The command line arguments are defined as follows:

/W [(WorkGroup)] - Restore files, indexes, relations, etc. from a
*.DCW Work file (if it exists) or from a File
Group Tag named (WorkGroup) in the DCFILES.DBF
file dictionary. If no (WorkGroup) name is
is given then a pick-list of File Groups
will be displayed.

/M [(Menu)] - Run a menu from the DCMENU.DBF Menu Dictionary.
If no (Menu) name is given then a pick-list of
Menus will be displayed.

/B [(Browse)] - If a (Browse) name is given, then load the
Browse configuration from the DCBROWSE.DBF
Browse dictionary and run the Browse System.
If no (Browse) name is given, then run the
browse using the built-in default browse
configuration.

/E [(Edit)] - If an (Edit) name is given, then load the
Editing configuration from the DCEDIT.DBF
Edit dictionary and run the Data-Entry System.
If no (Edit) name is given, then run the
edit using the built-in default edit
configuration.

/D [(Database)] - If a (Database) name is given, then open
the database, otherwise display a pick-list
of available databases.

/R [(Rdd)] - If an (Rdd) name is given, then select the
(Rdd) as the default data driver, otherwise
display a pick-list of available RDD's.

/I [(Index1),... - If a list of (Index)es is given, then open
(IndexN)] the index list (after opening the (database)
otherwise, display a list of indexes that
match the database.

/H - Display command line help

/Q - Quit to calling program, otherwise Return to
the dot-prompt.

/T - Start-Up dCLIP using the Turbo-Assistant,
otherwise start-up at the dot-prompt.

/A (Batch) - Execute (Interpret) a *.DCB (Batch) file
(p1,..p5) with parameters

/C (command) - Interpret a Dot-Prompt Command

/S (file) - Use (file) as alternative to DCLIP.SYS parameter file

/O (object) - Dynamic-Link a Clipper-Compiled *.OBJ file

/F (function) - Run a function (with parameters)


The following single arguments are also recognized for compatability
with drag and drop features of Windows and OS/2:

(database).DBF - Open database and Browse it

(workfile).DCW - Restore work areas from Work File and Browse

(object).OBJ - Load Clipper-compiled .OBJect and run

(batch).DCB - Execute a dCLIP Batch file

Description:

dCLIP may be passed command-line arguments for such operations
as opening files, restoring browse/edit configuration, running
a Batch (*.DCB) file, etc.

Examples:

    -- Example 1 --
   

* Restore work areas from CUSTOMER.DCW file
* Browse work areas
* Quit when completed browsing

dCLIP /W CUSTOMER /B /Q


-- Example 2 --

* Run a menu chosen from a pick-list

dCLIP /M


-- Example 3 --

* Open a database and indexes using the DBFCDX Data Driver
* Enter Data-Entry Screen

dCLIP /R DBFCDX /D CUSTOMER /I CUSTNAME,CUSTNMBR /E

See Also:

dc_execute()

GETTING STARTED

Please read this to GET STARTED with dCLIP

Description:

-- The DCLIP.SYS file --

A DCLIP.SYS file is included to configure your DOS gateway
to your other programs, your editor, compiler options, and
your default environment. Please see the CONFIGURATION
section for more information about configuring DCLIP.SYS.


-- Configuring your Editor for dCLIP --

To edit your source code from the Dot Prompt, type EDIT
(filename). This will invoke the dCLIP editor or your own
editor if you use an EDITOR=(parameter list) command in
your DCLIP.SYS file. You may configure dCLIP to use more
than one editor by creating command to call different
editors with the DCLIP.SYS file. Read the CONFIGURATION
section for help with DCLIP.SYS.


-- Compiling with dCLIP --

To compile your source code from the Dot Prompt, type
CLIPPER (filename) (options) in the same way you would use
CLIPPER from DOS. You must include CLIPPATH=(path)
command to define the location of the CLIPPER.EXE compiler
and may also include a CLIPOPT=(options) command to pass
default options to the compiler.


-- Running a Program from the Dot Prompt --

To run a program from the dot prompt, start up dCLIP by
typing dCLIP at DOS, then at the dot prompt, type:

. DO (procedure)

If the (procedure) is in memory it will be executed.
If the (procedure) is NOT in memory but (procedure).OBJ
exists on the disk, then (procedure).OBJ will be loaded
into memory before the (procedure) is called.

If the (procedure) is a user-defined function that exists
in an .OBJ file on the disk then the .OBJ file must first
be loaded into memory with the OBJ (object file) command.

If the procedure is exited with a RETURN command or BREAK
you will be returned to the Dot Prompt. If you exit your
application with a QUIT command you will be returned to
DOS.


-- Running and Debugging SMALL Applications --

To run an application program that consists of a set of
.OBJ files with imbedded procedures or user-defined
functions, you must either pre-load each .OBJ file
into memory or create a MAP file.

a. PRE-LOADING .OBJ FILES

Start up dCLIP and enter the following commands from the
Dot Prompt:

. OBJ (object 1)
. OBJ (object 2)
. OBJ (object N)

There must be sufficient OBJECT memory to load all the
.OBJ's into memory. Use SET CLIPPER=X(memory) at DOS
before starting dCLIP to allocate the size of the dynamic-
link pool. Any procedure or function in the loaded .OBJ's
can be executed from the dot prompt.

b. LOADING .OBJ FILES VIA A MAP

Start up dCLIP and enter the following command from the
Dot Prompt:

. MAP OBJ (filename)

This will create a map file name (filename).LST by scan-
ning all your Clipper-compiled .OBJ files. Before running
your application, enter the following command at the dot
prompt to load the MAP file:

. MAP (filename)


c. USING DYNAMIC LIBARIES

First create a dynamic library with the CAT.EXE and
DLIB.EXE program. We have included a batch file named
MAKEDLIB.BAT to get your started with your first
application.

STEP 1 - Compile all your source code .PRG files into
separate object modules using the /m option. You may use
the following Dot Prompt command to do this:

. CLIPPER ALL /m

STEP 2 - Enter the following command at DOS to create the
dynamic library:

) MAKEDLIB (dynamic library name)

Example: MAKEDLIB ACCTSPAY
This will create a new file named ACCTSPAY.DLR with a
listing of the object files to place into the dynamic
library file named ACCTSPAY.DLB with all the object code.

STEP 3 - Start dCLIP then enter the following commands at
the Dot Prompt:

. LIB (dynamic library) // Example: LIB ACCTSPAY
. DO (start program) // Example: DO MAINMENU


-- Running and Debugging LARGE Applications --

Large applications consisting of 10 or more .OBJ files
should be linked into a custom DCLIP.EXE by simply
including a list of your .OBJ files in a .LNK file per the
following example:

# MYAPP.LNK
FILE main
FILE menus
FILE myfuncs
FILE myprocs
..etc
..etc
..etc

Add the following line of code to the DCLIP3.BL or
DCLIP3.RT link script: @MYAPP.LNK

This will link your application code into a custom
DCLIP.EXE engine. Any function in your application can be
executed from the dot prompt. To make changes to the
application and re-test the changes without relinking,
simply enter the following commands from the Dot Prompt:

. EDIT (program)
. CLIPPER (program)
. OBJ (program)
. DO (procedure)

IMPORTANT

Important Notes (Please Read)

Description:

1. The dCLIP "dynamic-linking" system works with Clipper-
compiled .OBJ files only. Do not attempt to run .OBJ
files that were compiled in "C" or "ASM" or versions of
Clipper earlier than 5.0 or you will get an error. If
you use third-party functions in your applications, then
you must link them into a custom DCLIP.EXE engine using
the dCLIP libraries. See LIBRARIES for more
information.

2. dCLIP works best when you have small .OBJect modules.
This insures that an object will link faster and can be
released from memory when no longer needed. If you have
large objects which contain many procedure and
functions, it is recommended that you break them into
smaller objects.

3. dCLIP works best when you have sufficient memory. If
you have less than 550k available DOS memory before
starting dCLIP, then it is recommended that you use
the SET CLIPPER=X(memory) command to reduce the amount
of allocated dynamic-link pool from the default of 70k
to increase the free pool size.

4. The CLEAR ALL, CLEAR MEMORY or RESTORE FROM (non-
additive) command in your Clipper applications will
cause an unrecoverable error. dCLIP is a Clipper app-
lication, therefore these commands will erase the few
public arrays that are used within dCLIP. Be sure to
remove any CLEAR ALL or CLEAR MEMORY commands from your
applications before running them from dCLIP, or replace
the CLEAR ALL command with the following set of
commands:

RELEASE ALL
CLOSE ALL

Change RESTORE FROM (memory file) commands to the
following:

RESTORE FROM (memory file) ADDITIVE