Introduction
REVISIONS............eXPress++ Version Information
COMPUTER.............Computer System Requirements
GETTING STARTED......Please read this to GET STARTED with eXPress++
IMPORTANT............Important Notes (Please Read)
FEATURES.............Features of eXPress++
README.TXT...........The README.TXT file
GENERAL LICENSE......Your eXPress++ License
FAQ..................Frequently Asked Questions
PDR..................Problem Reports
REVISIONS
eXPress++ Version Information
Description:
To simplify distribution, this Help file includes documentation
on functions, commands and classes for all revisions of eXPress++.
Each command and function will include a revision letter after
the short description. This letter is the revision of eXPress++
that supports the command or function.
For example, if a function has the revision 1.3 after the title,
then this function is included in all versions of eXPress++
from 1.3 and above. If a function has the revision 2.0 after
the title, then this function is included only in revision 2.0
and above.
COMPUTER
Computer System Requirements
Description:
eXpress++ requires that you have an IBM compatible 32-bit
computer. dXpress is an add-on library designed only for
use with Alaska Software's Xbase++, therefore the computer
requirement are the same as for Xbase++.
* 486, 486-SX, or Pentium microprocessor
* 20 mb of available disk space.
* 32 meg total system memory
* Windows 95, Windows 98 or Windows NT 4.0
* VGA/SVGA Color monitor
* Microsoft-compatible mouse (optional)
* Alaska Software's Xbase++ Version 1.2 or later
GETTING STARTED
Please read this to GET STARTED with eXPress++
Description:
If you are using ALINK.EXE as your linker, then the only
eXpress++ files you need when "linking" your application are:
DCLIPX.LIB
EXPRESS.RES
If you are using BLINKER.EXE (version 5.0) as your linker,
then the only eXPress++ files you need when "linking" your
application are:
DCLIPXB.LIB
EXPRESS.RES
The files you need to distribute with your application are:
DCLIPX.DLL
DCLIPS.DLL
To see how to use eXPress++ commands in your application,
check out the XDEMO.EXE program. The source code for this
program is in the X*.PRG files which are located in the
\EXPRESS\SAMPLE directory.
NOTE: It is recommended that you modify your AUTOEXEC.BAT file
or your Windows NT Environment as follows:
SET PATH=<þcurrent PATH settingþ>;\express\lib
SET LIB=<þcurrent LIB settingþ>;\express\lib
SET INCLUDE=<þcurrent INCLUDE settingþ>;\express\include
Before attempting to use eXPress++ commands or functions in your
application, it is highly recommended that you run the XDEMO.EXE
program in the \express\sample directory. The samples contain
examples of how to write applications using eXPress++. If the
documentation is unclear about how to accomplish a task, look
at the samples.
IMPORTANT
Important Notes (Please Read)
Description:
eXPress++ is an evolving product. Registered owners are given
free access to the beta area of our Website. Reported bugs are
fixed often and patch files and free updates are posted on our
website. You must register your copy of eXPress++ to attain
access to these files.
REPORTING PROBLEMS
If you encounter a bug in eXpress++, please send an e-mail to
support@dclip.com. We can help you much faster if you also
include a small program (with source code) that demonstrates the
bug or the problem.
If you have questions about how to use eXpress++ or are confused
about documentation, samples, etc. please post your questions
on our support forum at http://donnay-software.com. This way,
the answers to your questions can be shared with other users of
eXpress++.
FEATURES
Features of eXPress++
Description:
* Converts @SAY..GETs to Windows-style dialogs or HTML
for Web applications. Supports WHEN, VALID and HIDE clauses.
* Converts @PROMPT and MENU TO to Windows-style pushbutton
menus.
* Converts AChoice() and DbEdit() to Windows-style browse.
* Converts SET DEVICE TO PRINT and @SAYs to Windows-style
printer commands.
* Build any complicated GUI dialog or HTML Web page using
simple procedural-style commands like this:
@ <þnRowþ>, <þnColþ> DCTABPAGE <þoGroupþ> CAPTION <þcTextþ>
@ <þnRowþ>, <þnColþ> DCSAY <þcSayþ> GET <þuVarþ> <þOPTIONSþ>
@ <þnRowþ>, <þnColþ> DCCHECKBOX <þuVarþ> PROMPT <þcPromptþ> <þOPTIONSþ>
@ <þnRowþ>, <þnColþ> DCRADIOBUTTON <þuVarþ> VALUE <þxValþ> <þOPTIONSþ>
@ <þnRowþ>, <þnColþ> DCMULTILINE <þuVarþ> <þOPTIONSþ>
@ <þnRowþ>, <þnColþ> DCLISTBOX <þuVarþ> LIST <þaListþ> <þOPTIONSþ>
@ <þnRowþ>, <þnColþ> DCCOMBOBOX <þuVarþ> LIST <þaListþ> <þOPTIONSþ>
@ <þnRowþ>, <þnColþ> DC3STATE <þuVarþ> PROMPT <þaVarþ> <þOPTIONSþ>
@ <þnRowþ>, <þnColþ> DCSPINBUTTON <þnVarþ> <þOPTIONSþ>
@ <þnRowþ>, <þnColþ> DCPUSHBUTTON CAPTION <þcCaptionþ> ;
SIZE <þnWidth, nHeightþ> ACTION <þbActionþ> <þOPTIONSþ>
@ <þnRowþ>, <þnColþ> DCGROUP <þoGroupþ> CAPTION <þcCaptionþ>
SIZE <þnWidth, nHeightþ> <þOPTIONSþ>
@ <þnRowþ>, <þnColþ> DCSTATIC <þoStaticþ> CAPTION <þcCaptionþ>
SIZE <þnWidth, nHeightþ> <þOPTIONSþ>
DCTOOLBAR <þoToolbarþ> TYPE <þnTypeþ> <þOPTIONSþ>
DCADDBUTTON CAPTION <þcCaptionþ> PARENT <þoToobarþ> ;
ACTION <þbActionþ> <þOPTIONSþ>
DCMESSAGEBOX <þoMsgþ> TYPE <þnTypeþ> <þOPTIONSþ>
DCMENUBAR <þoMenuBarþ> <þOPTIONSþ>
DCSUBMENU <þoSubMenuþ> PROMPT <þcPromptþ> PARENT <þoMenuBarþ> ;
<þOPTIONSþ>
DCMENUITEM PROMPT <þcPromptþ> PARENT <þoSubMenuþ> ;
ACTION <þbActionþ> <þOPTIONSþ>
@ <þnRowþ>, <þnColþ> DCBROWSE <þoBrowseþ> DATA <þaData | cAliasþ> ;
SIZE <þnWidth, nHeightþ> <þOPTIONSþ>
DCBROWSECOL <þnbDataþ> HEADER <þcHeaderþ> PARENT <þoBrowseþ>
<þOPTIONSþ>
DCBITMAP <þncResþ> PARENT <þoParentþ> <þOPTIONSþ>
@ <þnRowþ>, <þnColþ> DCSCROLLBAR DATA <þuVarþ> ;
SIZE <þnWidth, nHeightþ> SCROLL <þbScrollþ> <þOPTIONSþ>
@ <þnRowþ>, <þnColþ> DCPROGRESS <þoProgressþ> ;
SIZE <þnWidth, nHeightþ> <þOPTIONSþ>
DCGETOPTIONS WINDOW SIZE <þnWidth, nHeightþ> SAYFONT <þcFontþ>
ROWSPACE <þnPixelsþ> <þOPTIONSþ>
@ <þnRowþ>, <þnColþ> DCDIRTREE DIRS <þoDirsþ> VAR <þcDirVarþ> ;
DATALINK <þbDirLinkþ>] FILES <þoFilesþ> VAR <þcFileVarþ> ;
DATALINK <þbFileLinkþ> <þOPTIONSþ>
.. more commands
* Fully compatible with dCLIP++, an application development
system for creating data-driven applications. GUI dialogs
can be loaded from a data-dictionary.
* Includes a .DLL for distribution with your Xbase++
applications and .LIB files to link the .DLL to your
application with either ALINK or BLINKER 5.0
* Includes all source code.
* Includes a full set of sample programs to make it easy to
get started.
* Complete on-line documentation in Windows .HLP format.
* Includes Clipper .MEM file conversion utility.
* Includes a set of Scoping functions to make it easier to
migrate Clipper applications using RDDs that support
scoping like SX_SetScope(), CMXSetScope, CMXSetRelation(),
AX_SetScope(), etc.
* Upgrades and patches available on World-Wide-Web.
* Unlimited Free Technical support
README.TXT
The README.TXT file
Description:
The text file titled README.TXT is located in the root of
the installation directory and contains information about any
late developments, additions, or changes that did not make
it into the printed documentation. It also contains a
complete history of changes since version 1.0. Please read
this file before using eXpress++. It is an ordinary text file
you can view with any text editor, word processor, or the DOS
command: TYPE README.TXT. To PRINT the README.TXT file use the
following DOS command: COPY README.TXT PRN.
GENERAL LICENSE
Your eXPress++ License
Description:
1. You MAY freely distribute any .EXEcutable application
that uses any portion of the dXPress libraries and/or
the eXPress++ .DLLs in your own custom applications.
2, You MAY freely distribute the DCLIPX.DLL and DCLIPS.DLL
files with your applications.
3. You MAY NOT distribute to any third party, any portion
of the eXPress++ source code.
4. You MAY use the eXpress++ libraries on only one computer
at a time for each license that is owned. The eXPress++
libraries or eXPress++ .DLLs 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.
FAQ
Frequently Asked Questions
Description:
Q. Is DCDIALOG.CH a superset or a different (and larger) set from
EXPRESS.CH ? If I include DCDIALOG.CH, is there no need to also
include EXPRESS.CH ? Is there a minimum set of include files I
need in order to have all eXPress++ commands available to me
when coding an application?
A. EXPRESS.CH is only recommended if you want to convert existing
Clipper @SAY..GETs without changing any code. It is highly
recommended that you _NEVER_ use EXPRESS.CH but instead get used
to using DCDIALOG.CH. This is a much more robust command set
however, it does require that you change @SAY..GET commands to
@DCSAY..GET commands. For most applications, only DCDIALOG.CH
is required, however, if you are using eXPress++ printer commands
you must include DCPRINT.CH and if you are using less popular
commands like DCDIR or DCAPPEDIT you must include DCDIR.CH and
DCAPP.CH respectively. The documentation for each command also
contains info about the .CH file that contains the command.
-------------------------------------------------------------------
Q. In sample code, I notice that GetList and GetOptions variables
should be initialized (before using the get reader). There seems
to be an inconsistency in that GetOptions is initialized simply
to NIL (that is, no value is assigned), whereas GetList is
initialized to an empty array.
A. The GetList array must be initialized to an empty array because
each DC* command "adds" an element to the GetList array.
GetOptions should be initialized to a NIL only out of convention
because, in the event that the GET OPTIONS command is not used
yet the GetOptions variable is passed to DC_ReadGui(), it must
be either a NIL or a valid GetOptions array. Anything else may
create a runtime error. The GET OPTIONS command creates a valid
array from the arguments used with the command.
-------------------------------------------------------------------
Q. Is "GUI ON" or DC_Gui(.t.) actually needed when using DCDIALOG.CH ?
A. Most DCDIALOG.CH commands simply add information about objects
to a GetList which will be processed later via the DC_ReadGUI()
or DC_ReadGets() function. When using the DCREAD GUI command or
DC_ReadGUI() function, the GetList will be processed via the GUI
reader regardless of the state of DC_Gui(). When using the
DCREAD command or the DC_ReadGets() function, the GetList is
processed by the text reader when DC_Gui() is .FALSE. or by the
GUI reader when DC_Gui() is .TRUE. It is highly recommended that
applications be created an converted to work in GUI mode only.
Dual-Mode is provided only for quick conversion of existing
Clipper code. Once the programmer realizes how many more
features are available in GUI mode, using the GUI reader will
become second-nature. If the end result is to create a full-GUI
application, then set DC_Gui(.T.) and the beginning of the
application and never change it.
-------------------------------------------------------------------
Q. After creating all my objects with DC* commands, I want to make
sure that DCREAD GUI sets the focus to a specified object on a
specified Tab Page before entering the event loop. How do I do
that?
A. The DCREAD GUI command supports an EVAL clause. The code-block
associated with this clause will be evaluated just before
the GUI reader enters its event loop. Use this code-block to
accomplish any task which cannot be done until all the objects
have been created. Example:
DCREAD GUI EVAL {||SetAppFocus(oTabPage3), SetAppFocus(oBrowse)}
An additional method is to use the SETFOCUS <þoObjectþ> clause in
the DCREAD GUI comand.
-------------------------------------------------------------------
Q. I want to use DCREAD GUI to add objects to an existing XbpDialog
parent that already has other objects and then destroy those
objects when returning from the GUI reader without touching
previously created objects.
A. Use the desired DC* commands to add the objects to the GetList,
then pass the GetList and the parent object to the GUI reader.
After exiting the GUI reader, destroy the objects with the
DC_GetDestroy() function. Example:
LOCAL GetList := {}
// Add all objects here
DCREAD GUI PARENT @oDialog
DC_GetDestroy(GetList)
----------------------------------------------------------------------
Q. My Browses sometimes fail to display headers and/or scrollbars.
What do I do?
A. This is an anomoly in Xbase++ caused by adding XbpColumn objects
to an XbpBrowse object when the XbpBrowse is visible. The
browse will repaint itself properly simply by hiding and showing
it again. The EVAL clause of DCREAD GUI can be used to resolve
this problem like so:
DCREAD GUI EVAL {||oBrowse:hide(), oBrowse:show()}
----------------------------------------------------------------------
Q. DC_ReadGUI() gives me an error when browsing an empty array.
A. At the present time, there is no solution to this problem.
Make sure that there is at least one element in any array
that is being browsed.
----------------------------------------------------------------------
Q. My date pictures are not working properly in some of my GETS.
I give it a picture clause of '99/99/9999' but still get only a
display of '99/99/99'
A. Make sure to use the SET DATE FORMAT command to set the date
format for 10 characters. Ex: SET DATE FORMAT TO "mm/dd/yyyy".
----------------------------------------------------------------------
Q. Is it possible to reference the getlist within a function,
within a valid clause e.g. I need to know which get I am on
i.e. the 1st get or 2nd get and use this to operate things in
my function.
A. Yes. The GetList can be referenced in any code block and used
later in validation routines, navigation routines, etc.. It
isn't usually necessary to pass the GetList however, because a
pointer to the GetList is stored in :cargo for each object in
the GetList. The :cargo instance variable contains an array of
at least three (3) elements. The first element of :cargo is the
element number of the GetList that contains all the information
about the object. The second element is a pointer to the
GetList array. The third element is whatever value was stored
in CARGO in the GetList with the CARGO <þxCargoþ> option. If you
have a pointer to the object then you can always get a pointer
to the GetList. Conversely, if you have a pointer to the
GetList, you can get a pointer to the object because the object
is stored in GetList[ <þnGetNumberþ>, oGETLIST_OBJECT] ).
----------------------------------------------------------------------
Q. What is the EVAL clause used for on DC* commands?
Is this option something for us to manipulate? If so what?
A. EVAL is used to evaluate any code-block immediately AFTER the
object is created by DC_ReadGUI(). When DC_ReadGUI() reads the
GetList, it creates the object based on all the passed options
for that object. Before continuing on to the next item in the
GetList, it is sometimes desirable to call a special function to
handle some special circumstance for the object that was just
created. A pointer to the object is passed to the code-block.
The Get-List array is designed to handle only the most commonly
used options for an object like VISIBLE, HIDE, CURSOR, TABSTOP,
COLORS, LOCATIONS, SIZES, etc. There are many classes that
support other features that may be desirable to enable or
change.
Look at the DCMULTILINE example in XDEMO1.PRG. You'll see how
the EVAL clause is used to store a code block into the :rbdown
callback slot so the right button will popup a special menu.
@ 5,2 DCMULTILINE cMemo PARENT oTabPage3 SIZE 78,8 ;
TITLE 'MULTLINE History Memo' ;
TABSTOP ;
FONT "10.Courier" ;
OBJECT oMemo ;
EVAL { |o| o:RbDown := { |x,y,z| oMenuMemo:PopUp ( z, x, 2 ,;
XBPMENU_PU_DEFAULT + XBPMENU_PU_MOUSE_RBDOWN ) } }
------------------------------------------------------------------
Q. How do I get dialog messages on buttons like OK and CANCEL to
display in GERMAN?
A. Add a call to DC_LangSet('GERMAN') at the beginning of your
program.
------------------------------------------------------------------
Q. Why does the COLOR clause not work on most DC* commands?
Win32 - Windows supports the definition of a foreground color
only for XbpDialog:drawingArea, XbpStatic(), XbpBrowse() and all
classes derived from XbpSetting().
eXPress++ was written entirely in Xbase++ code, thereby offering
source compatability with the Windows, OS/2 and all future OS's
supported by Alaska. The COLOR clause was included on all
commands for future compatability even though it may not be
compatabile with the current version of Windows.
------------------------------------------------------------------
Q. Is there a recommended order for placement of the commands? I
am building a complex screen with many tabs, subtabs, browses,
and other DC* commands. Sometimes they do not work as expected
in one order, but do in another.
A. Commands which reference a PARENT object must always come AFTER
the creation of the PARENT object. This is basically the same
rule as when programming completely object-oriented. A PARENT
object cannot be referenced if it does not exist. Basically,
objects get created in the order they appear in the GetList
array, so parent objects must be created first. For example,
a DCTABPAGE command must come before an @DCSAY..GET command
which uses the TabPage as it's parent.
------------------------------------------------------------------
Q. I am having difficulty getting MODAL popup windows to work
correctly. If the first MODAL window has a button that invokes
a second MODAL window, clicking back on the first window
causes a lockup condition.
A. For MODAL windows to function properly, the calling window
must be the SetAppWindow(). This can be accomplished quite
easily by using the EVAL clause of the DCREAD GUI command
like so:
DCREAD GUI ;
FIT ;
ADDBUTTONS ;
MODAL ;
EVAL {|o|SetAppWindow(o)}
------------------------------------------------------------------
Q. How do I create a button to exit the DCREAD GUI event loop and
close the dialog window.
A. Use the DC_ReadGuiEvent() function like so:
@ 10,10 DCPUSHBUTTON CAPTION 'Ok' ;
SIZE 10,2 ACTION {||DC_ReadGuiEvent(DCGUI_EXIT_OK)}
@ 10,30 DCPUSHBUTTON CAPTION 'Cancel' ;
SIZE 10,2 ACTION {||DC_ReadGuiEvent(DCGUI_EXIT_ABORT)}
------------------------------------------------------------------
Q. Why do my source code files compile so slow when I use a lot of
eXPress++ commands?
A. The Xbase++ pre-processor works overtime when converting the
eXPress++ commands to equivalent functions. Most of the
commands build a large array of properties which are added to
the GetList. This is a time-intensive process, especially when
compiling to COFF format .OBJ files. Blinker 5.1 allows for
linking of OMF format .OBJ files. The XPP.EXE compiler runs
from 5 to 10 times faster when compiling with the /OMF switch.
Upgrading to Blinker 5.1 can save considerable time in compiling
and linking. It also supports multiple resource files.
PDR
Problem Reports