               ---------------------------------------
                THE NATIONAL LANGUAGE INTERFACE (NLI)

                             FROM

                   THE EUROPEAN PARADOX ASSOCIATION
               ---------------------------------------


INTRODUCTION
Paradox is available in several language versions. For Europe there is a
Norwegian, Swedish, Finnish, Danish, English (US), Dutch, German, French,
Spanish, Italian and Hebrew version of Paradox. As members of the European
Paradox Association (EPA) we regularly have to deal with applications having
to run on multiple language versions of Paradox. To ease the development
process (for Paradox for DOS) two of our members Flemming Christensen of
C & B International (Denmark) and Phil Goulson of Richplum (United Kingdom)
created a utility called the National Language Interface (NLI). The NLI is
available as freeware not only to help Paradox developers to reach a larger
market but also to help Paradox users in general as more applications and
utilities will become available for their language version. Apart from the
English version (of course) the NLI currently supports the Danish, Dutch,
French, and Italian versions. Other language versions will be supported in
future if that language version is sent to one of the EPA members.


DESCRIPTION
The NLI is an Application Programming Interface (API) for Paradox developers
to enable them to develop applications that will work with multiple language
versions of Paradox for DOS. Using the NLI the developers can make calls to a
special NLI routine whenever the application requires a language version
dependent section like a Paradox menu call. The NLI routine will then take
care of selecting the required menu option with its appropriate name. This
routine can handle all language dependent possibilities except for the
standard Paradox system messages. As applications should not be dependent on
the system messages their absence in the NLI should not diminish its usability.

The NLI comes as a script that will create a library (NLI.LIB). This library
contains a procedure (NLImenu) to be called instead of a language dependent
PAL statement, some procedures needed by the NLImenu procedure, and an
initialisation procedure for each language version supported. The
initialisation procedure should be called at the beginning of each application.
It will determine the current language version and fill a dynamic array with
the appropriate values. The dynamic array named NLI contains an element for
each of the language dependent possibilities. This array is used by the NLImenu
procedure but its elements can also be used directly in an application. The
dynamic array is used to minimize the performance degradation. Unfortunately
the dynamic array will take up approximately 160 KB of memory. If memory
preservation is a major issue the dynarray elements not used can be commented
out in the NLI.SC script.
A test script (NLITEST.SC) is included showing some of the usage of the NLI.

USAGE
In order to use the NLI the following initial steps have to be taken:
1. Play the NLI.SC script.
   The NLI script will create the NLI.LIB library. The script is not password
   protected so the source code can be reviewed.
2. Add the NLI library to the AutoLib variable.
   By adding the NLI library to the AutoLib variable all NLI procedures will
   become available.
   Eg. AutoLib = AutoLib + ",NLI"
3. Call the NLI initialisation procedure for the current language version.
   The NLI initialisation procedure will fill the NLI dynamic array with the
   appropriate values. The NLI library contains an initialisation procedure
   for each of the language versions supported. The names of these procedures
   all start with "NLI" followed by a three digit country code. For instance
   the English (American) procedure is called "NLI001" and the French procedure
   "NLI033". A general approach for calling the appropriate initialisation
   procedure could be:
       SysInfo to SysInfo.y                      ;SysInfo.y is a dynamic array
       ExecProc "NLI" + SysInfo.y["LANGUAGE"]


PAL by itself is language independent. All language versions use PAL-commands
like 'VIEW', 'PICKFORM', 'WHILE', etc. The language dependent areas are:
* Menu options like {View}, {Ask}
* The names of temporary tables like 'Answer', 'List', 'Struct'
* Query related options like 'CHANGETO', 'SET', 'EVERY'
* Form design related like 'Formula', 'Embedded'
* Report design related like 'Table Band', 'Average of'
* System modes like 'Main', 'CoEdit', 'File Editor'
* Prompts of system dialog boxes as 'Value:', 'Expression:', 'Setup string:'
* Miscellaneous items like the names of the fields in temporary tables like
  the fields 'Field Name' and 'Field Type' in the temporary table 'Struct'

For all these areas the NLI dynamic array contains elements. The element names
have prefixes for the different areas followed by an indicator of the actual
contents of the element (a complete description of the elements of the NLI
dynamic array can be found in the appendix):

AREA                                  PREFIX            EXAMPLE

Menu options                          MENU              MENU.VIEW
Temporary table names                 TABLE             TABLE.ANSWER
Query related			      ASK               ASK.CHANGETO
Form design related                   FORM              FORM.FORMULA
Report design related                 REPORT            REPORT.TABLE BAND
System modes                          MODE              MODE.COEDIT
Prompts of system dialog boxes        PROMPT            PROMPT.VALUE
Miscellaneous items like field        INFO              INFO.FIELD NAME
  names of temporary tables

Remark:	As mentioned before the NLI does not support the Paradox system
        messages. Language independent applications should not rely on
        these messages.


To create a language independent application the NLI dynamic array elements
can be used directly.
For example:
	Traditional way:	The NLI way:

	if SysMode() = "CoEdit"	if SysMode() = NLI["MODE.COEDIT"]

	if IsEmpty("Answer")	if IsEmpty(NLI["TABLE.ANSWER"])

Another method for using the NLI system is calling the NLI procedure NLImenu.
When calling this procedure a string has to be passed as argument. The string
should contain the action(s) the procedure should convert. The string can
contain:

1. Menu options
2. Selections (put between braces {})
3. Keypresses or literal typeins (put between square brackets [])
4. The Enter key can also be passed by a blank string ("")
   instead of "[Enter]"
5. Language dependent typeins (put between round brackets ())
6. NLI dynamic array elements can be passed directly by concatenation of
   the argument string
7. Variables can be used within the call by preceding the variable name
   with a tilde (~).
8. Multiple actions can be passed by separating the actions with commas

Examples of using the NLImenu procedure (the numbers in the Ref. column refer
to the list of the possibilities of the argument string given above):

REF.:   TRADITIONAL WAY:         THE NLI WAY:

1       Menu {View}              NLImenu("View")

1,2,8   Menu {View} {Customer}   NLImenu("View,{Customer}")

1,2,6,  Menu {Modify} {Edit}     NLImenu("Modify,Edit,"
8       {List}                   + "{" + NLI["TABLE.LIST"] + "}")

1,2,7,  Menu {Modify} {Edit}    NLImenu("Modify,Edit,"
8       Select TableName        + "{~TableName}")
1,2,3,  Menu {Ask}              NLImenu("Ask,"
6,8     {List}                  + "{" + NLI["TABLE.LIST"] + "},"
        Check Do_It!            + "[Check],[Do_It!]")

1,2,3,  Menu {Ask}              NLImenu("Ask,"
4,6,8   {List}                  + "{" + NLI["TABLE.LIST"] + "},"
        Enter                   + ","
        Check Do_It!            + "[Check],[Do_It!]")

1,2,3,  Menu {Ask}              NLImenu("Ask,"
4,5,6,  {List}                  + "{" + NLI["TABLE.LIST"] + "},"
8       Enter                   + ","
        TypeIn "not List"       + "(not),[ " + NLI["TABLE.LIST"] + "],"
        Check Do_It!            + "[Check],[Do_It!]")

1,2,3,  Menu {Ask}              NLImenu("Ask,"
4,5,6,  {List}                  + "{" + NLI["TABLE.LIST"] + "},"
8       Enter                   + ","
        TypeIn "List, " +       + "[" + NLI["TABLE.LIST"] + "]")
                                TypeIn ", "
        "changeto \"EPA\""      NLImenu("(changeto),[ \"EPA\"],"
        Do_It!                  + "[Do_It!]")

1,2,3,  Menu {Ask}              NLImenu("Ask,"
6,8     {List}                  + "{"+NLI["TABLE.LIST"]+"},"
        Check                   + "[Check]")
        MoveTo [Date]           MoveTo Field NLI["INFO.DATE"]
        TypeIn "<TODAY"         TypeIn "<"+NLI["ASK.TODAY"]


CONCLUSION
The NLI system has been used by our members for some time now. It has proven
itself as a very useful system for really international applications and
utilities. By making it available as freeware the EPA hopes to encourage
others to create applications and utilities for the world market (starting
with Europe). If you have to deal with a language version not supported (yet)
please send a copy of the version to one of the EPA members. That language
version will than be included as soon as possible.
The EPA would like to thank Flemming Christensen of C & B International
(Denmark) and Phil Goulson of Richplum (UK) for their splendid work in creating
the NLI system (and of course for allowing the EPA to make it a freeware
product).

DISCLAIMER
The NLI system is available as freeware. Everyone is free to use the NLI
system including the source code in applications, provided that:
1. the following copyright statement is declared in their source code and in
   their accompanying documentation:
              COPYRIGHT 1993 European Paradox Association
2. their source code and accompanying documentation contain a clear and
   unequivocal statement that the application is usable in various language
   versions of Paradox through incorporation of the European Paradox
   Association's National Language Interface.

Neither the European Paradox Association nor its members assumes any
responsibility whatsoever for the uses made of the NLI system or for
decisions based on its use. The NLI system is supplied as is, without warranty
of any kind, either expressed or implied, respecting the contents of this
documentation or the NLI system itself; including, but not limited to implied
warranties for their quality, performance, or fitness for any particular
purpose. Neither the European Paradox Association nor its members shall be
liable to any person or entity with respect to liability, loss, or damage
caused, or alleged to be caused directly or indirectly by these materials or
use.


APPENDIX:

=============================================================================
NLI array elements
-----------------------------------------------------------------------------

Mode:
      "mode.main"
      "mode.create"
      "mode.restructure"
      "mode.dataentry"
      "mode.file editor"
      "mode.edit"
      "mode.coedit"
      "mode.sort"
      "mode.form"
      "mode.report"
      "mode.graph"
      "mode.password"
      "mode.index"

Info:
      "info.username"
      "info.product"
      "info.filename"
      "info.locktype"
      "info.field name"
      "info.field type"
      "info.menuchoice.error"
      "info.name"
      "info.date"
      "info.mon"
      "info.tue"
      "info.wed"
      "info.thu"
      "info.fri"
      "info.sat"
      "info.sun"
      "info.Savevars"

Editor:
      "menu.editor.file"
      "menu.editor.new"
      "menu.editor.open"
      "menu.editor.save"
      "menu.editor.copytofile"
      "menu.editor.insertfile"
      "menu.editor.writeblock"
      "menu.editor.print"
      "menu.editor.edit"
      "menu.editor.xcut"
      "menu.editor.copy"
      "menu.editor.paste"
      "menu.editor.erase"
      "menu.editor.goto"
      "menu.editor.location"
      "menu.editor.showclipboard"
      "menu.editor.search"
      "menu.editor.find"
         "menu.find"
      "menu.editor.next"
      "menu.editor.replace"
         "menu.replace"
      "menu.editor.changetoend"
      "menu.editor.options"
      "menu.editor.autoindent"
      "menu.editor.wordwrap"
      "menu.editor.casesensitive"


Table:
       "table.keepentry"
      "table.answer"
      "table.changed"
      "table.inserted"
      "table.deleted"
       "table.crosstab"
      "table.entry"
      "table.keyviol"
      "table.problems"
      "table.family"
      "table.list"
      "table.struct"

Prompt:
      "prompt.script:"
      "prompt.table:"
      "prompt.value:"
      "prompt.setup string:"
      "prompt.reset string:"
      "prompt.Expression:"

Report:
      "report.report header"
      "report.report footer"
      "report.page header"
      "report.page footer"
      "report.group header"
      "report.group footer"
      "report.table band"
      "report.form band"
      "report.current date"
      "report.current page number"
      "report.Current record number"
      "report.wrap:"
      "report.total for"
      "report.Per Group"
      "report.Average of"
      "report.Count of"
      "report.Maximum for"
      "report.Minimum for"
      "report.date.1"
      "report.date.2"
      "report.date.3"
      "report.date.4"
      "report.date.5"
      "report.date.6"
      "report.date.7"
      "report.date.8"
      "report.date.9"
      "report.date.10"
      "report.date.11"
      "report.date.12"

Form:
      "form.formula"
      "form.embedded.start"
      "form.embedded.end"

ASK:
      "ask.changeto"
      "ask.set"
      "ask.Max"
      "ask.Min"
      "ask.Only"
      "ask.No"
      "ask.Every"
      "ask.Exactly"
      "ask.Like"
      "ask.today"
      "ask.blank"
      "ask.not"
      "ask.or"
      "ask.as"
      "ask.fast"
      "ask.calc"
      "ask.sum"
      "ask.average"
      "ask.count"
      "ask.find"
      "ask.insert"
      "ask.delete"

MENU:
      "menu.view"
      "menu.ask"
      "menu.create"
      "menu.report"
      "menu.modify"
      "menu.forms"
      "menu.tools"
      "menu.scripts"
      "menu.exit"

MENU (Altspace)
      "menu.next"
      "menu.maximize/Restore"
      "menu.Size/Move"
      "menu.Close"
      "menu.Window"
      "menu.Interface"
      "menu.Desktop"
      "menu.redraw"
      "menu.tile"
      "menu.cascade"
      "menu.empty"
      "menu.surfacequeries"
      "menu.Video"
      "menu.video.A:"
      "menu.video.B:"
      "menu.video.C:"
      "menu.video.D:"
      "menu.video.E:"
      "menu.video.E:A:"
      "menu.video.E:B:"
      "menu.video.E:C:"
      "menu.video.E:D:"
      "menu.video.F:"
      "menu.video.F:A:"
      "menu.video.F:B:"
      "menu.video.G:"
      "menu.video.G:A:"
      "menu.video.G:B:"
      "menu.video.G:C:"
      "menu.video.G:D:"
      "menu.video.G:E:"
      "menu.video.H:"
      "menu.video.H:A:"
      "menu.video.H:B:"
      "menu.video.H:C:"
      "menu.video.H:D:"
      "menu.video.H:E:"
      "menu.video.H:F:"
      "menu.video.I:"
      "menu.video.I:A:"
      "menu.video.I:B:"
      "menu.video.I:C:"
      "menu.video.J:"
      "menu.video.J:A:"
      "menu.video.J:B:"
      "menu.video.J:C:"
      "menu.video.J:D:"
      "menu.video.K:"
      "menu.video.K:A:"
      "menu.video.K:B:"
      "menu.video.L:"
      "menu.video.L:A:"
      "menu.video.L:B:"
      "menu.video.M:"
      "menu.video.M:A:"
      "menu.video.M:B:"
      "menu.video.N:"
      "menu.video.N:A:"
      "menu.video.N:B:"
      "menu.video.N:C:"
      "menu.editor"
      "menu.new"
      "menu.open"
      "menu.utilities"
      "menu.custom"
      "menu.workshop"
      "menu.about"

MENU (REPORT)
      "menu.output"
      "menu.design"
      "menu.change"
      "menu.rangeoutput"
      "menu.setprinter"
      "menu.regular"
      "menu.override"
      "menu.printerport"
      "menu.setup"
      "menu.reset"
      "menu.endofpage"
      "menu.linefeed"
      "menu.formfeed"

MENU (MODIFY)
      "menu.sort"
       "menu.Same"
       "menu.new"
      "menu.Same"
      "menu.new"
      "menu.edit"
      "menu.coedit"
      "menu.dataentry"
      "menu.multientry"
      "menu.entry"
      "menu.setup"
      "menu.restructure"
      "menu.index"

MENU (IMAGE)
      "menu.image"
      "menu.tablesize"
      "menu.columnsize"
      "menu.format"
      "menu.general"
      "menu.Fixed"
      "menu.Comma"
      "menu.Scientific"
      "menu.MM/DD/YY"
      "menu.DD-Mon-YY"
      "menu.DD.MM.YY"
      "menu.YY.MM.DD"
      "menu.zoom"
      "menu.field"
      "menu.record"
      "menu.Value"
      "menu.move"
      "menu.pickform"
      "menu.keepset"
      "menu.ordertable"
      "menu.graph"
      "menu.graph.modify"
      "menu.load"
      "menu.save"
      "menu.reset"
      "menu.cancel"
      "menu.ok"
      "menu.crosstab"
      "menu.crosstab.sum"
      "menu.crosstab.min"
      "menu.crosstab.max"
      "menu.crosstab.count"
      "menu.viewgraph"
      "menu.screen"
      "menu.printer"
      "menu.file"



MENU (FORMS)
      "menu.design"
      "menu.change"



MENU (SCRIPTS)
      "menu.cancel"
      "menu.end-record"
      "menu.play"
      "menu.querysave"
      "menu.repeatplay"


MENU (EXIT)
      "menu.No"
      "menu.Yes"


MENU (TOOLS)
      "menu.rename"
       "menu.table"
       "menu.form"
       "menu.report"
       "menu.script"
       "menu.graph"
      "menu.queryspeed"
      "menu.exportimport"
      "menu.export"
       "menu.quattro"
       "menu.quattro.1.x"
       "menu.quattropro"
       "menu.123"
       "menu.123.1.a"
       "menu.123.2"
       "menu.symphony"
       "menu.symphony.1.0"
       "menu.symphony.1.1"
       "menu.dbase"
       "menu.dbase.2"
       "menu.dbase.3"
       "menu.dbase.4"
       "menu.pfs"
       "menu.reflex"
       "menu.reflex.1.0"
       "menu.reflex.1.1"
       "menu.reflex.2.0"
       "menu.visicalc"
       "menu.ascii"
       "menu.delimited"
       "menu.appenddelimited"
       "menu.text"
      "menu.import"
      "menu.copy"
       "menu.sametable"
       "menu.differenttable"
       "menu.justfamily"
      "menu.delete"
       "menu.index"
       "menu.keepset"
       "menu.valcheck"
      "menu.info"
       "menu.structure"
       "menu.inventory"
       "menu.tables"
       "menu.scripts"
       "menu.files"
       "menu.family"
       "menu.who"
       "menu.lock"
       "menu.tableindex"
      "menu.net"
       "menu.lock"
       "menu.fulllock"
       "menu.writelock"
       "menu.dirlock"
       "menu.preventlock"
        "menu.fulllock"
        "menu.writelock"
       "menu.setprivate"
       "menu.username"
       "menu.autorefresh"
       "menu.changes"
        "menu.restart"
        "menu.continue"
      "menu.more"
       "menu.add"
       "menu.multiadd"
       "menu.formadd"
       "menu.subtract"
       "menu.empty"
       "menu.protect"
        "menu.password"
        "menu.clearpasswords"
        "menu.write-protect"
       "menu.directory"
       "menu.todos"


MENU (FORM MODE)

      "menu.field"
       "menu.place"
        "menu.regular"
        "menu.displayonly"
        "menu.calculated"
        "menu.#record"
       "menu.erase"
       "menu.reformat"
       "menu.calcedit"
       "menu.wordwrap"
      "menu.area"
       "menu.move"
       "menu.erase"
      "menu.border"
       "menu.place"
        "menu.single-line"
        "menu.double-line"
        "menu.other"
       "menu.erase"
      "menu.page"
       "menu.insert"
        "menu.after"
        "menu.before"
       "menu.delete"
      "menu.style"
       "menu.color"
        "menu.area"
        "menu.border"
       "menu.monochrome"
       "menu.fieldnames"
        "menu.show"
        "menu.hide"
       "menu.showhighligth"
      "menu.multi"
       "menu.tables"
        "menu.place"
         "menu.linked"
         "menu.unlinked"
        "menu.remove"
        "menu.move"
        "menu.displayonly"
       "menu.records"
        "menu.define"
        "menu.remove"
        "menu.adjust"

MENU (FORM MODE - CALCULATED FIELD - MULTI / TABLES / DISPLAY ONLY)

      "menu.master"
      "menu.other"



MENU (REPORT MODE - TABULAR)

      "menu.tabular"

      "menu.field"
       "menu.place"
        "menu.regular"
        "menu.summary"
         "menu.regular"
         "menu.calculated"
        "menu.calculated"
        "menu.date"
        "menu.time"
        "menu.page"
        "menu.#record"
         "menu.overall"
         "menu.per-group"
       "menu.erase"
       "menu.reformat"
       "menu.justify"
       "menu.calcedit"
       "menu.wordwrap"
       "menu.report.lookup"
        "menu.link"
        "menu.unlink"
        "menu.relink"
      "menu.tableband"
       "menu.insert"
       "menu.erase"
       "menu.resize"
       "menu.move"
       "menu.copy"
      "menu.group"
       "menu.insert"
        "menu.field"
        "menu.range"
        "menu.numberrecords"
       "menu.delete"
       "menu.headings"
       "menu.sortdirection"
       "menu.regroup"
      "menu.output"
       "menu.printer"
       "menu.screen"
       "menu.file"
      "menu.setting"
       "menu.format"
        "menu.tableofgroups"
        "menu.groupsoftables"
       "menu.grouprepeats"
        "menu.retain"
        "menu.suppress"
       "menu.pagelayout"
        "menu.length"
        "menu.width"
        "menu.insert"
        "menu.delete"
       "menu.margin"
       "menu.setup"
        "menu.setup predefined"
        "menu.setup custom"
       "menu.wait"

MENU (REPORT MODE - NUMERIC FORMATS)

      "menu.digits"
      "menu.sign-convention"
       "menu.NegativeOnly"
       "menu.ParenNegative"
      "menu.AlwaysSign"
      "menu.Commas"
       "menu.NoCommas"
       "menu.Commas"
      "menu.International"
       "menu.U.S.Convention"
       "menu.InternationalConvention"

MENU (REPORT MODE - ALPHANUMERIC FORMATS)

      "menu.left"
      "menu.center"
      "menu.right"
      "menu.default"

MENU (REPORT MODE - CALCULATED FIELD)

      "menu.sum"
      "menu.Average"
      "menu.count"
      "menu.high"
      "menu.low"
      "menu.PerGroup"

MENU (REPORT MODE - FREE-FORM)

      "menu.free-form"

      "menu.setting"
       "menu.removeblanks"
        "menu.linesqueeze"
        "menu.fieldsquezze"
       "menu.labels"


MENU (GRAPH MODE)

      "menu.graph.type"
      "menu.graph.overall"
       "menu.graph.titles"
       "menu.graph.colors"
        "menu.graph.copy"
         "menu.graph.screentoprinter"
         "menu.graph.printertoscreen"
       "menu.graph.axes"
       "menu.graph.grids"
       "menu.graph.printerlayout"
       "menu.graph.device"
        "menu.graph.printer"
         "menu.graph.1stprinter"
         "menu.graph.2ndprinter"
         "menu.graph.3rdprinter"
         "menu.graph.4thprinter"
        "menu.graph.file"
         "menu.graph.currentprinter"
         "menu.graph.eps"
         "menu.graph.pic"
       "menu.graph.graph.wait"
        "menu.graph.keystroke"
        "menu.graph.duration"
      "menu.graph.series"
       "menu.graph.legendsandlabels"
       "menu.graph.markersandfills"
       "menu.graph.colors"
      "menu.graph.pies"

MENU (EDIT MODE)

      "menu.undo"
      "menu.valcheck"
       "menu.define"
        "menu.lowvalue"
        "menu.highvalue"
        "menu.default"
        "menu.tablelookup"
         "menu.justcurrentfield"
          "menu.privatelookup"
          "menu.helpandfill"
         "menu.allcorrespondingfields"
          "menu.fillnohelp"
        "menu.picture"
        "menu.required"
        "menu.auto"
         "menu.filled"
         "menu.picture"
         "menu.Lookup"
       "menu.clear"
      "menu.do-it!"
      "menu.do_it!"
      "menu.cancel"

MENU (CREATE MODE)

      "menu.borrow"
      "menu.fileformat"
       "menu.standard"
       "menu.compatible"

MENU (RESTRUCTURE MODE)

      "menu.justfamily"

      "menu.convert"
      "menu.oops!"

      "menu.Trimming"
      "menu.No-Trimming"

-----------------------------------------------------------------------------


=============================================================================
HOW som of the elements was found
-----------------------------------------------------------------------------

Embedded Forms:
---------------

    The fieldinfo() for embedded forms is obviously different in every
    language. The value of the elements NLI["form.embedded.start"] and

 NLI["form.embedded,end"] are contructed as follows:

   embedded.start  = the word(s) that precede the table name
   embedded.end    = the word(s) that follow the table name - excluding
                     the Form number.

   eg: in English the elements would contain:

       embedded.start = "Embedded "
       embedded.end   = " table using form "

   Note: in all languages the form no in fieldinfo() is immediately
         followed by a comma if the table is linked/displayonly.
         (use NLI(["menu.linked"]) or NLI(["menu.displayonly"]) to check
          for these conditions)


  Examples :

   1: The following PAL code could be used to test for an embedded table:

       if  match(fieldinfo(),
                  NLI["form.embedded.start"] + ".." +
                  NLI["form.embedded.end"]   + "..")
       then .....

   2: The following PAL code could be used to get the table name and
      form no.

       fieldinfo.a = fieldinfo()
       sign        = match(fieldinfo.a,"..,..", fieldinfo.a, the.rest)

       sign = match(fieldinfo.a,
                  NLI["form.embedded.start"] + ".." +
                  NLI["form.embedded.end"]   + "..", tablename, formno)


 NLI["form.formula"]

    When you have a calculated field in Forms the word "formula" is
    contained at the start of fieldinfo().
    All the other fieldinfo() values (ie. Regular, DisplayOnly) are as per
    the menu elements.

    eg:
    if substr(fieldinfo(),1,len(menu["form.formula"])) = menu["form.formula"]
    if substr(fieldinfo(),1,len(menu["menu.regular"])) = menu["menu.regular"]


Prompts
-------

    All the elements has been created with the MENUPROMPT PAL-command.


          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

