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