First of all, sorry for my ugly English,
but it seems to me it's better to have poor documentation than nothing.

Editor of DBF-files BDBFS.EXE


Programmer's guide


	Following does not apply for the complete description, but
probably it will be useful to somebody.

	The current description corresponds to the version
			BDBFS 1.21


Table of Contents

  • 1.Why BDBFS?
  • 2.Supported formats of the data.
  • 3.Editing of records.
  • 4.Replace-modes.
  • 5.Append/Copy.
  • 6.SUM.
  • 7.Search an index (tag).
  • 8.Expressions of conditions.
  • 9.Set Fields.
  • 10.Calculation of expressions.
  • 11.Variables initialization.
  • 12.Structure modifying.
  • 13.Records inserting.
  • 14.TOTAL.
  • 15.Saving / restoring an environment.
  • 16.Initialization files.
  • 17.Macro-keys.
  • 18.Exit to DOS.
  • 19.Using of a mouse.
  • 20.Compatibility with FoxPro.
  • 21.Working in a network and multitask systems.
  • 22.Errors processing.
  • 23.Expressions of highlighting.
  • 24.Jobs with the clipboard.
  • 25.History of conditions and expressions.
  • 26.Stack of positions.
  • 27.Edition of memo-fields and external files.
  • 28.Printing forms.
  • 29.Keyboard codes.
  • 30.User menu.
  • 31.Header checking.
  • 32.Plug-ins.
  • 33.Start BDBFS.
  • 34."Forced" mode.
  • 35.Video-modes.
  • 36.What is absent in BDBFS in comparison with "competitors".
  • 37.Known problems.
  • 38.Gratitudes.
  • 39.FeedBack.
  • 40.The form of distribution.
  • SUPPLEMENT I. List of hot-keys.
  • SUPPLEMENT II. Messages.
  • SUPPLEMENT III. Supported functions.
  • SUPPLEMENT IV. BDBFS-PRO.


    1. Why BDBFS?

    
    	And really - there are a lot of analogues, only to author
    the following viewers/browsers are known:
    
    	- dbview by Trophimenko ~3k!!!!
    	- dbview by Tsarenko ~32k but with edition and search
    	- popdbf by Bowen-software - sole TSR, known for me
    	- vdbf by Rodionoff, served by a push for development
    	- d123 by Deveza
    	- dbeditor by Jeff Parnau
    	- dbfedit by Lau Preston
    	- dbed by Dmitrieff
    	- cdbf by Tchehuta
    	- dbc by Kresin
    	- dbfview by Tibor Kovach
    	- clut by Sergio Cocci
    
    	And thus I do not doubt at all, that all is listed not.
    It is possible also to use and firm DBU from Nantucket/CA.
    It is possible simply to use Fox or there Delphi any ;-).
    
    Nevertheless, BDBFS has a niche.
    At a development BDBFS the motto was:
    	" We'll make with the chosen base, all that we want! "
    
    You can use practically all functions necessary for daily jobs with bases!
    Almost all of them can be called via hot-keys.
    Besides it is desirable to have "near at hand" a uniform product for
    jobs with different formats of bases and indexes.
    
    	So, BDBFS is able:
    
    	- automatically or optionally to choose a format
    	  of indexes and MEMO-fields from Clipper,FoxPro,dBase4,SIX
    	- to edit records in a mode BROWSE and EDIT
    	- to print chosen base (optionally into file), all or on
    	  condition
    	- to prepare special report file
    	- to modify base structure
    	- to optimize base structure
    	- to print structure on the printer or into a file
    	- to search on a condition LOCATE / CONTINUE
    	- to search for a context without binding to fields
    	- to search in current field
    	- to copy records
    	- to copy contents of separate fields from the left and right
    	  sides, from below and from above
    	- to establish an existing index (or tag)
    	- to make a new index (or tag)
    	- to make "soft" index search
    	- to make wildcard index search
    	- Replace on a condition
    	- Sum, Count, Total on a condition
    	- Delete/Recall on a condition
    	- Copy to File / Append from, including on a condition and
    	  in text formats. The transformation and renaming of fields
    	  is possible. MEMO-fields can be converted to different format.
    	- to establish filters
    	- to sort base
    	- to establish the necessary order and quantity of fields,
    	  their headings. The calculated fields are possible! Thus
    	  the chosen cut can be printed out and is saved for further use!
    	- to calculate any Clipper-expression
    	- to set variables
    	- to clear at once all record
    	- to make Upper and Lower in text fields
    	- to change modes of input
    	- to work with the mouse
    	- to choose all conditions from a history
    	- to save and to restore an environment
    	- to read ini-files
    	- to highlight with color various cells on a condition
    	- to work with the own clipboard and Win-clipboard
    	- "to freeze" fields for viewing
    	- to search for a maximum / minimum
    	- to change the disks / directories (Filer)
    	- to use long names Win9x
    
    	- and other pleasant trivialities.
    
    	Almost all functions can be called as through hot keys, so
    and through the menu.
    
    	Majority of functions is clear for any xBase-man (though
    acquaintance with Clipper it is desirable). Some explanatories are below.
    Appointments of all hot keys see in HELP and in SUPPLEMENT I.
    
    


    2. Supported formats of the data.

    	The formats of xBase-files are supported basic for today:
    
    		 dBASE3/Clipper		 (DBT/NTX)
    		 FoxPro			 (FPT/IDX/CDX)
    		 dBASE4			 (DBT/MDX)
    		 SIX3			 (SMT/NSX)
    
    	If the base has memo-field, the appropriate driver is defined
    automatically. Besides you can set the default driver in an ini-file
    or through the menu.
    
    	FoxPro (SIXCDX) driver is default.
    
    	Except for standard Clipper-fields, Float (FoxPro) and
    VariField (SIX) are supported.
    
    	You'll be asked for password for SIX ciphered files.
    
    	The new formats of Visual FoxPro, dBASE5, FlagShip, FlexMemo are
    supported in "forced" mode (see ch.34).
    
    	It is really possible to make support of NDX, if it is necessary
    for somebody else.
    	Unfortunately, I have not the drivers for other existing
    formats (Comix, Inx, etc) :-(.
    
    
    


    3. Editing of records.

    
    	The initial mode of BDBFS is "VIEW".
    
    	For starting of edition ("BROWSE" mode) it is necessary to press
    Enter in chosen field, then you receive practically Browse of FoxPro:
    keys Up, Down, PgUp, PgDn, Tab, Shift+Tab are acceptable.
    
    	Besides BDBFS passes in a mode "BROWSE" by pressing any "simple"
    key depending on a type of a field. For example, if current field's type
    is Numeric, entrance in edition passes by pressing any figure, and this
    figure at once is displayed.
    For an exit from a mode "BROWSE" it is necessary to press Escape or
    Ctrl+W. As against FoxPro (dBase), for editing a memo-field special
    keys don't need to be pressed.
    
    	There are four modes of input in "BROWSE". In "Usual" mode
    pressing Enter in last the field of record simply stops input;
    in a mode "Enter/skip" in this case there is a transition to first
    field of the following record; in a mode " Lock Enter" pressing
    Enter in any the field results in descent to record below in the
    same field. In a mode "Enter/stop" after pressing Enter there is
    a transition to a mode "VIEW". The modes can be switched during input.
    
    	Except for a mode "BROWSE" there is a mode "EDIT". It allows
    editing of the fields "vertically". This mode is acceptable from a
    mode "VIEW" via hot key Alt+E(dit).
    	It is sometimes convenient to edit a symbolical field exceeding
    the size of the screen, as a memo-field. It can be made by pressing a key
    Alt+W(ide).
    
    	You can undo the editing changes (by Ctrl+U, Alt+BS). Undo
    buffer is defined by variable _UndoSize and can be from 0 to 4095 actions
    (default 1024). Any global operation (like ZAP, PACK) clears the undo buffer.
    
    
    


    4. Replace-modes.

    
    	BDBFS supports three Replace modes (all - in current field):
    		- constant expression		Alt+F4
    		- varied expression		Ctrl+F4
    		- in the current record		Alt+R
    
    	A difference between Alt+F4 and Ctrl+F4 we'll explain
    on an example:
    
    	Let we stand in a field NUM on 15 records. Now we set the
    expression of replacement Recno()+2 and the scope - all records.
    
    	Now the value 17 will be brought in all records by Alt+F4,
    and accordingly 3,5,7.. by Ctrl+F4.
    
    	Can ask: and what for is necessary for Replace in the current
    record, if it is possible simply to correct it? But imagine, that
    the field contents 3242756 and it is necessary to multiplicate it on 234.
    With Alt+R it is simple - Field*234.
    
    	Shift with any replace function (f.e. Ctrl+Shift+F4),
    causes the confirming for each record. It's especially convenient with
    varied expression.
    
    
    


    5.Append/Copy.

    F3 simply adds the empty record, Alt+F3 - offers to copy contents of current or last record. It is possible also to press F3 in a mode "BROWSE", then new record will be added with the copied current field. It is possible also to make "Append from file" (Ctrl+F9), and if in name of a file is specified extension other than DBF, inquiry of file type will be made: SDF, WITH DELIMITERS, DBF. Same concerns and to "Copy File" (Ctrl+F3). It is possible also to append from "myself" (current base). There are two conflict situations with appending: incompatible field types and numeric overflow. In BDBFS the disputable concept is now accepted: the maximal performance of operations. It means, that in the first case the attempt of types transformation is made, and in second case the greatest possible number enters in a field. For example, if field's length is 3 and number is 1200, "999" will be entered. At copying a file it is possible to specify only required fields (via Alt+F2). The transformation and renaming of fields is accessible also at copying (to base, but not to SDF). It some kind of mini-"Query By Example". For example, you can set expressions in the list of fields: Num, Num*2 AS Double, Upper(Char), CTOF(Char) AS Secret The optional "AS" clause specifies the heading for a name in the query output (Num*2 AS Double - the field in new base will be called "DOUBLE"). If the target field is not named (word "AS" is not used) and a select item is expression, a field will be named Exp_??, where ?? - serial number in the list (is similar FoxPro). If the expression can't be calculated, it is ignored. See also the description of
    function DBTrans(). It is possible also to copy (to transform) the base (table) to a HTML format. This operation is accessible through the menu File -> Create HTML. See also description of function Tb2Html().


    6. SUM.

    
    	The summation always occurs on the current field, it is possible
    to choose and calculated field too (see below). It is possible to
    summarize numerical or symbolical field (i.e. SUM(VAL(field))).
    It is meant, that you know, that you do. It is also possible to use the
    function Sum (see below).
    
    


    7. Search an index (tag).

    
    	When you search index key of DATE-type, it is not necessary
    to write CTOD. So, is equally correct
    		12/03/93  CTOD('12/03/93')  DATE()
    
    	By search on an index of a symbolical type the value should be
    concluded in inverted commas. However, if the expression of search begins
    with figure or symbol with a code more than 127, the inverted commas are
    not obligatory.
    
    	By default the search is conducted in a mode SoftSeek OFF
    (SET NEAR - for habitual to FoxPro). To set a mode SoftSeek ON
    it is necessary to make
    		Alt+G Set(9, .t.)	// see Set.CH,
    or to write =Set(9,.T.) in an ini-file.
    
    	Sometimes it happens necessary to find not unique records in an
    index. It can be made by pressing Alt+2. The cursor thus will be
    established on duplicating record.
    
    	The search on a mask (naturally, in an index of a character type)
    is accessible also.  The mask is similar DOS. For example, it is possible
    to set:
    
    		Alt+[ 'B?LL',	// found: BILL
    		Alt+Shift+]	// found: BYLL
    
    		Alt+ [ 'JO*SON' // found: Johnson,Johanson etc.
    
    
    


    8. Expressions of conditions.

    
    	At a choice of many functions BDBFS, you will be requested for
    condition of selection or searching. It is possible to vary expressions
    in such conditions widely enough. Any system and user functions can be
    applied. Sole restriction - length expressions (no more than 255 symbols).
    
    
    


    9. Set Fields.

    
    	By Ctrl+F2 you can set the contents, names(headings), show format
    and order of fields. The contents of a field can be any allowable expression.
    The symbols of national alphabets in the contents now are allowable only
    in russian version (see NATIONAL.TXT).
    
    	Example:
    	Contents of a field: If(Deleted(), [Yes], [No])
    	Name: Is marked?
    
    	To divide the name of the field use the symbol ;.
    	Example:
    	This;Field;Name		//3 lines
    
    	You could also set the picture and width for each field.
    The formats of the pictures are described in any xBase language.
    	Example:
    		Field: Money
    		Picture: 999,999.99
    
    	To finish changes press F10. Then you can press again Ctrl+F2
    to restore all fields.
    
    	The calculated fields will not be editable. Besides, they can
    be used in expressions.
    
    	The fields was marked as deleted (via DEL) will not be shown and
    edited. F8/ blocks/unblocks all fields below current.
    
    	The required order can be established by pressing Ctrl+Up or
    Ctrl+Down.
    
    	The required order and contents of fields can be established
    consistently. Let's assume, we have removed from viewing some field.
    And now we don't want to see another field, not only previous. Press
    again Ctrl+F2 (to restore all fields), again Ctrl+F2, then F5 and
    you can see previous established fields. Correct further, etc..
    
    	Set Fields does not influent on "Copy TO" operation.
    
    
    


    10.Calculation of expressions.

    
    	By pressing Shift+F6 (Alt+G(o), ?) it is possible to calculate
    almost any correct Clipper expression of length up to 255 symbols.
    Not speaking about it is necessary to remember, what number was Date()-21
    or quickly to take Log(Exp(1)) :-), it has turned out rather interesting
    simulator for Clipper-programmer. It is possible, for example, to
    experiment with parameters Memoedit, to understand, at last, than differs
    Bin2i from Bin2w or to take an interest, that such Descend('').
    
    	It is possible to use almost all functions from Clipper.Lib and
    Extend.Lib, number useful (on my sight) functions of known libraries
    Six3, NanFor, Clipper Tools, Netto, Blinker, emulation of some functions
    FoxPro, and also number of special functions BDBFS.
    	The list of functions see in SUPPLEMENT IV.
    
    


    11.Variables initialization.

    
    	By Ctrl+F5 you can initialize variable (or to set
    it's new value).
    
    	For simple variable it is necessary simply to execute assignment
    
    		new=5
    		word:='daddy'
    		today=date()
    
    	For the announcement of a array it should be described:
    
    		arr[20] or arr=Array(20)
    
    	Then it is possible to make Arr[3]=Exp(12.09).
    	However, it is possible and directly to write:
    		Arr := {10,20,'example'}
    
    	Any correct Clipper expression are allowable in the right part.
    
    	What for all this is necessary?
    
    	You can, f.e. store result of previous operation and use it
    	later.
    		F6				// sum current field
    		Ctrl+F5	Sum1:=__sum	// store it
    
    	It is sometimes convenient to calculate expression, and then it
    to use in conditions. Using assignment variable and calculation
    expressions it is possible even to write small programs. Try, f.e.,
    to make following:
    	Ctrl+F5	aPrg=Array[Adir('*.prg ')]
    	Alt+G		Adir('*.prg ', aPrg)
    	Alt+G		ForAch (5,10,24, 'Program', aPrg)
    
    	Selecting the index, which has non-standard extension.
    
    	Ctrl+F5	_oldind:='MyOwn.FIL '
    	Ctrl+F5	_req=0
    
    	Choosing base from backup copies.
    
    	Ctrl+F5	_mask = '*.bak'
    	F4
    
    
    	Printing base with a fine font and with the slogan.
    
    	Ctrl+F5	_PSCode ='We are the champions ' +chr(15)
    	F2
    
    	It is possible to give the block of a code
    	Ctrl+F5	bck = {| i|i+1} , then
    	Alt+G		Eval(num)
    
    
    	Some examples are in Examples.Ini.
    
    
    


    12.Structure modifying.

    
    	After change of structure, previous version remains with
    extension BAK. If there was a memo-file, it remains with extension TBK.
    
    	If at updating there is a situation of numerical overflow,
    it will be brought 0 in a field.
    
    	In the program is realized known Clipper-trick - symbolical
    fields with length more than 255 symbols. It is made so: in a field
    Field_Dec enters Mod(Length, 256), in a field Field_Len - rest.
    For example: length of a field is 700. Then Field_Dec=2, Field_Len=188.
    But to enter necessary length in BDBFS it is enough to correct Field_len.
    Then the necessary sizes will be brought automatically.
    
    	F9 (except for the driver SIXMDX) causes function of structure
    optimization (like in OTTO utility from SIX-driver). It is made with
    using VariField by the following rules:
    	- All CHARACTER fields greater than 16 characters are
    	  defaulted to 10 byte "V" fields. However, for short CHARACTER
    	  fields, or those whose data is always a fixed length, you may
    	  want to change them back to "C" types manually instead of using
    	  "V" types.
    
    	- All MEMO fields are defaulted to 6 byte "V" fields.
    
    	- All NUMERIC fields greater than four bytes long and less than
    	  11 bytes long are converted to four byte "I" (long integer
    	  fields.
    
    	- All 8 byte DATE fields are converted to 3 byte DATE fields.
    
    	For non-English named fields see NATIONAL.TXT.
    
    
    


    13.Records inserting.

    
    	As is known, Clipper doesn't have the operation INSERT.
    But sometimes it would be desirable very much. Therefore it is necessary
    to go by heavy way: append, to move all downwards, to clear top. On the
    large bases it can take long time. INSERT does not work with active INDEX
    or TAG.
    
    
    


    14.TOTAL.

    
    	The are some difference between TOTAL in BDBFS and in Clipper:
    
    	- "ON" expression always equals IndexKey(0), so it doesn't work
    	   in SORTed base;
    	- ALL fields are copied to the new database (Clipper excludes
    	   the memo-fields);
    	- if field "TOTALCOUNT" exists, it will be filled with number of
    	  totalled records on each key expression;
    	- fields with alias (like base->fld1) aren't supported.
    
    
    


    15.Saving / restoring an environment.

    
    	You can define any variable, set conditions of search and
    summation, specify an index and necessary fields etc., and
    then save all this in a usual memo-file, having pressed Shift+F1.
    	If then at any moment to press Shift+F5 and to set a name of
    this file, the all this environment, including used DBF, will be
    (whenever possible) restored. Besides, it is possible at once to load an
    environment, having set a name of MEM-file in a command line. Certainly,
    can be as much as necessary files of an environment in the directory.
    
    	The file BDBFS.MEM is used by default.
    	If variable _AutoSave: =.T. is determined in a INI-file
    (or directly from the program), the file BDBFS.MEM is created in the
    current directory automatically at an exit.
    	If variable _AutoRestore: =.T. is determined in a INI-file and
    BDBFS.EXE is started without parameters, a file BDBFS.MEM from current
    directory is read out automatically.
    
    
    


    16.Initialization files.

    
    	You can at loading or later, by pressing Ctrl+F12, to read
    contents of a file of initialization. The file of initialization
    represents from itself a usual text file, containing assignment variables,
    and also, probably, performance of some functions, mini-programs.
    	Variable will be then are accessible in the program.
    
    	The following operations are determined:
    
    	
    A. Assignment.
    
    	Syntax:
    		<var>:=<expression>		or
    		<var> = <expression>		or
    		#define <var> [<expression>]
    
    	Examples:
    		MyVar=100
    		MyVar := 100
    		MyVar=Sqrt(4)
    		#define MyVar 100
    
    	In the latter case, as against of Clipper and C #include,
    the variable will be announced and are accessible for all session time.
    Default <expression> for #define is .T..
    	Can be useful the defining of code blocks in ini-file. Then they
    can be used in program as functions.
    
    	Example:
    	//in ini-file
    		Squart = {|i|  'the Area of a circle with radius '+STR(i,3)+;
    				' = '+LTRIM(STR(3.1415 * i * i,16,2))}
    
    	//in program
    		{?} Squart(4) or
    		{?} Eval(Squart,4)
    
    
    	
    B. Function evaluation without assignment variable.
    
    	Syntax:
    		=<expression>	or
    		<expression>
    
    	Examples:
    		=Tone(440,3)
    		Eval(bEval, 100)
    
    	Keep in mind, that you must use =<expression> form, when
    symbol "=" is inside <expression>, f.e.
    		=Devout('S='+S)
    
    
    	
    C. Including of another initialization file.
    
    	Syntax:
    		#include <FileSpec>
    
    	The attention for Clipper & C programmers: the name of a file
    could be given without inverted commas.
    
    	<FileSpec> may contain an explicit path and file name as well as a
    file extension. If, however, no path is specified, bdbfs searches the
    following places:
    
    	- Current directory
    
    	- Directories supplied in global variable _PlugDir
    	  (default - <place of bdbfs.exe>\plugins)
    
    	- Directories specified in the INCLUDE environment variable.
    
    	Examples:
    		#include second.ini
    		#include 'second.ini'
    		#include c:\my\second.ini
    
    	As the operation #define is supported, it is possible to
    include standard Clipper .ch files, like inkey.ch, Set.ch.
    Notice, that #define with parameters is not supported yet.
    
    
    	
    D. User-defined command.
    
    	Syntax:
    		#xcommand <matchPattern> => <resultPattern>
    
     <matchPattern> is the pattern to match in the input text.
    
     <resultPattern> is the text produced if a piece of input text matches
    	 	the .
    
    	Patterns can include parameters (match markers). Match markers
    are label and optional symbols delimited by angle brackets (<>) that
    provide a substitute (idMarker) to be used in the <resultPattern> and
    identify the clause for which it is a  substitute.
    	As against commands of Clipper-preprocessor, only one parameter
    (or absence of parameters) is supported.
    
    	Examples:
    
    	  #xCommand INVERT =>;
    		    DBEval({||Rlock(),IF(DELE(),dbRecall(),dbDelete())})
    
    	  #xCommand MODIFY COMMAND <x> = > ModiFile(<x>)
    
    	  #xCommand EOM(<x>) => FT_LDAY(<x>)
    
    	It is most natural to apply commands from calculation of
    expressions, for example:
    		{?} INVERT
    
    	
    E. Defining of command's local table.
    
    	Syntax:
    		#LOCALTABLE
    
    	The commands defining by #xcommand operators occupate some memory
    and slow down a little the calculation's execution (the substitution is
    tested for each expression). So it is sometimes useful to free command's
    table after execution.
    
    	Example:
    		#LOCALTABLE
    		#include MyCmd.ch
    
    	Suppose, the set of commands are defined in MyCmd. The
    preliminary definition by #LOCALTABLE guarantees the clearing of
    resources after ending of ini-file interpretation.
    
    
    	
    F. MACRO keys definition.
    
    	Syntax:
    		#MACRO <key code> => <a sequence of pressing>
    		or
    		#MACRO_IN_[scope] <key code> => <a sequence of pressing>
    
    	The sequence of pressing can be given as symbolical line
    (KEYBOARD format), or as a array of codes (INKEY format).
    In the second case it is possible to set the functional and extended keys,
    but length of a sequence is less or equal 16 symbols.
    
    	Next scopes modifications could be given:
    
    		#MACRO_IN_BROWSE - main mode,
    		#MACRO_IN_DIALOG - dialogues of conditions and field list
    		#MACRO_IN_FIELD  - GET mode
    		#MACRO_IN_MEMO   - edition of memo-fields and text files
    
    	If the scope isn't given the macro-key will be active in all modes.
    
    
    	Examples:
    		#MACRO 307 => {-9, 'F', 'A'}
    		;Create HTML via menu on Alt+<.
    
    		#MACRO_IN_FIELD 308 => "It we'll press quite often at
    		edition"
    
    		#MACRO_IN_DIALOG 383 => 'Like("*",&_C_F)'+REPL(CHR(19),9)
    		;Alt+* suitable for pattern
    
    
    	
    G. Announcement of the local variables.
    
    	Syntax:
    		#LOCAL <v1>,<v2>...	or
    		LOCAL <v1>,<v2>...
    
    	If the variable isn't announced as local, it exist for the
    duration of the program. Local variables are visible only within the
    current ini-file.
    
    	Example:
    		#LOCAL cFile,nSum
    
    	 Inline assignments are prohibited:
    		LOCAL cX:=""		//Error!!!
    
    
    	
    H. Execution's termination.
    
    	Syntax:
    		#BREAK  or
    		#BREAK <condition>
    
    	#BREAK without parameter forces the immediate termination of
    the ini-file interpretation, #BREAK with <condition> terminate the
    interpretation if condition are valid:
    
    	Example:
    		#BREAK File("NeedFile")
    
    
    	
    I. Parameters and return value.
    
    	Up to 5 parameters can be passed to ini-file. They are
    accessible via _1.._5 identifier. Ini-file can return the value to
    the calling process.
    	Syntax:
    		#RETURN <expression>	or
    		RETURN <expression>
    
    	Examples:
    		#RETURN 4.
    		#RETURN _1*_2+_3
    
    	#RETURN doesn't terminate the interpretation, it only defines the
    result. There can be more than one #RETURN in ini-file.
    
    	The calling of ini-file with parameters is suitable from
    calculation or user menu:
    
    	{?} RestoreIni("MyPlug",Date(),"Example",2.4)
    
    	You can use the recurrent RestoreIni(), so in "MyPlug" can be
    written:
    
    	RestoreIni("R2")
    	and so on.
    
    	Since the version 1.21 you can use the direct calling of ini-file
    as a function:
    	{?} MyPlug(par1,par2)
    
    	Ini-file should have .ini extension in this case, that is
    unessential in case of RestoreIni().
    
    
    	
    J. Alternative execution.
    
    	Syntax:
    		#IF <lCondition>		(or IF <lCondition>)
    			<statements>...
    		#ELSE				(or ELSE)
    			<statements>...
    		#ENDIF				(or ENDIF)
    
    	It is the analogue of usual xBase IF..ENDIF statement.
    
    	<lCondition> is a logical control expression. If it evaluates to
    true (.T.), all following statements are executed until an #ELSE or
    #ENDIF is encountered.
    
    	#ELSE identifies statements to execute if the #IF condition
    evaluates to false (.F.).
    
    	#IF...#ENDIF structures may be nested within other #IF...#ENDIF
    structures up to 10 levels for one ini-file.
    
    	Example:
    		#IF Continue("Do you want to make something?")
    			<statements for "Something">
    		#ELSE
    			Nfind("May be next time...")
    		#ENDIF
    
    	The special cases of #IF operator are operators #IFDEF, #IFNDEF.
    They are often used in Clipper #include files for prevention of repeated
    loading.
    	Examples:
    
    	//in set.ch
    	#ifndef _SET_CH
    		... constants announcements
    
    		#define _SET_CH
    	#endif
    
    	//in plugins\clipper.ch
    	#IFDEF _CLIPPER_CH
    		#BREAK		//yet another? No, Exit!
    	#ENDIF
    	...
    	#DEFINE _CLIPPER_CH
    
    	The symbol # is obligatory in #IFDEF, #IFNDEF.
    
    
    	
    K. WHILE cycle.
    
    	Syntax:
    		#WHILE <lCondition>	or  WHILE <lCondition>
    			<statements>...
    		#ENDW[hile]		or ENDWHILE or #ENDDO or ENDDO
    
    
    	It is the analogue of usual xBase WHILE..ENDWHILE statement.
    
    	<lCondition> is a logical control expression. If it evaluates to
    true (.T.), all following statements are executed until an #ENDWHILE is
    encountered.
    
    	#WHILE...#ENDWHILE structures may be nested within other
    #WHILE...#ENDWHILE structures up to 10 levels for one ini-file.
    
    	Example:
    		sum:=0
    		#WHILE !EOF()
    			sum:=sum+FieldGet(1)+FieldGet(2)
    			DBSKIP()
    		#ENDWHILE
    
    
    You probably also will want to use functions For() and While() for organization of cycling in ini-files (see SUPPLEMENT IV). A lot of various examples are contained in the demonstration file Examples.ini and in PLUGINS directory.
    See also ch.32. At start of the program the attempt is made to read a file BDBFS.INI, taking place in the program's start directory. If file of initialization is not given in a command line, then the attempt is made to consider a file BDBFS.INI, taking place in the current directory (at its absence is searched BDBF.INI - for compatibility with the previous versions of BDBF). If the file with extension .AOP (Auto Open) will be found in the current directory, it will be read automatically when the base with appropriate name will be opened. You can define some commands, variables, menu (see ch.30) specific for this base. Besides, you can define list of necessary fields here. Fields list is given in variable FIELDS and headers list in variable HEADS. Formats (show patterns) of fields can be given in variable PICTURES. Width of each fields can be given in variable Widths. Calculated fields can be also given. Example: Fields:={'Char','Num','Num*2'} Heads:={'Character;field','Numeric;field','Double value'} Pictures:={, '999,999.99'} Widths:={7,,,} You can also define other useful instruction (see also Supplement IV). For example it's possible to set index or tag: _IndexFile:="MyIndex" or __TagNom:=3 or __TagName:='MyTag' You can interactively define an index and necessary fields (via Ctrl+F2), and then save all this in AOP-file, by pressing Ctrl+Shift+F1. Calling of any ini-file (f.e., via {Ctrl+F12}) results to compulsory reopening of current base. If you do not wish it, you should define variable lNoReOpen:=.T. in any place of ini-file.


    17.Macro-keys.

    
    	By pressing Ctrl+F1 the sequence of symbols, saved in variable
    _MACRO is called. In a mode VIEW this opportunity works as Set Key,
    in edition - as Set Function.
    
    		Example:
    
    	Ctrl+F5 _Macro=chr(4) +chr(4) +chr(13)
    
    	Now, in a mode VIEW, by Ctrl+F1 you will enter edition of a field
    	CurrentField+2
    
    	Ctrl+F5 _macro ='Bravo!'
    
    	Now, in a modes of edition, by Ctrl+F1 in a field the text Bravo!
    will be written down.
    	It is convenient, when it is necessary in an interactive mode to
    bring in many fields similar information.
    
    	In a mode of edition the following macros are additionally
    determined:
    		Alt+(	=	() and cursor inside of brackets
    		Alt+)	=	() and cursor outside
    		Alt+{	=	{}
    		Alt+"	=	[]
    		Alt+A	=	.AND.
    		Alt+O	=	.OR.
    		Alt+B	=	{||}
    		Alt+C	=	CTOD("//")
    
    	It is especially convenient at definition of a condition.
    
    	It is possible to define and own macros:
    
    		? __SetFunction (< a code of a key >, < macros >),
    or via command #MACRO in ini-file.
    
    	Besides in a mode of edition the "hot" keys are accessible
    transformations of the current focus of input (same work and in VIEW):
    		Alt+U	= UpperCase
    		Alt+L	= Lower
    		Alt+K	= Capitalize (Proper)
    		Alt+Q	= English -> National (if you casually have typed
    			  something in "English" keyboard instead of
    			  "National").
    		Alt+Y	= on the contrary.
    
    


    18.Exit to DOS.

    
    	At an exit to DOS via Alt+F10, BDBFS occupies in memory 8k.
    
    	If you want to start the large program directly under BDBFS,
    it is possible to use function BliRun().
    
    	Alt+G BliRun('FoxPro').
    
    	BliRun() returns the error level of process.
    
    
    


    19.Using of a mouse.

    
    	In a mode of a viewing the following rules work:
    
    	- any button on a line of the base name = Select Base
    	- any button on a line of the field names = Set Fields
    	- any button on a functional line = appropriate function
    	  (exception: right button on F10 finishes without demand),
    	  including and with Ctrl, Shift and Alt
    	- any button on bottom scroll bar - transition on
    	  relative position of a field in a file
    	- any button in the basic space (4-MaxRow()-3 lines) =
    	  transition to this field
    	- left button on the same field = Enter
    	- any button on MaxCol() column - transition in a file on relative
    	  position.
    
    	In a mode of a choice (Achoice, f.e., at a choice of an index):
    
    	- right button = Escape
    	- left on the top frame = PgUp
    	- left on the bottom frame = PgDn
    	- left inside - first time: stay on an element, second time:
    	  select it.
    
    	In a menu and in an edition:
    
    	- right button = Escape
    	- left button = Enter
    
    	At a showing of the warning messages - any button = any key.
    
    
    


    20.Compatibility with FoxPro.

    
    	BDBFS is able to look and to edit files FoxPro with memo-fields.
    The index files are completely supported.
    
    	As it was already marked, in Browse the keys Tab, Shift+Tab,
    Ctrl+T are supported.
    	System variable of printing and the amount of the processed records
    have the same names, as in FoxPRO.
    	In expressions it is possible to use almost all functions FoxPro,
    not corresponded with screen (Screen, Menu) and printed forms.
    	The correctness of locking in a network is provided.
    
    	If there is a file EUROPEAN.MEM in the current directory, it is
    read out at start.
    
    	The new types of Visual FoxPro are supported in "forced" mode
    (see ch.34).
    
    
    


    21.Working in a network and multitask systems.

    
    	All files are opened in mode of sharing for records, that allows
    various processes to use the same base.
    	BDBFS tested in a NOVELL network and in sessions of
    Windows 9*/ME, Windows NT/2000/XP, Windows 3.11, OS/2, DV.
    
    	The joint job is guaranteed with the applications using standard
    blocking mode of dBase . The joint job is not guaranteed, f.e. with
    Dbview from Norton-Commander.
    
    	BDBFS independently gives back TimeSlice, so at job in multitask
    systems there is no necessity for the extraneous programs such as TAME.
    
    
    


    22.Errors processing.

    
    	Generally, many efforts are undertaken, that the wrong actions
    did not finish the job completely. Besides a number possible disputed
    situations manage before their occurrence.
    
    	Nevertheless mistakes of the program are not excluded.
    	In this case BDBFS draws the frame and writes something like
    		"Incorrect expression xxxxxxx"
    The large request: notice it "xxxxxxx" and inform me.
    But mean, that such message could arise and as a result of your incorrect
    expression, then it is necessary simply to recover.
    
    	There is, however, number of non-restorable mistakes, f.e.,
    " Disk full ". It can appear, for example, at copying a file
    (it is difficult to check up beforehand, since it is not known, how
    much places will be occupied by a file, selected on a condition).
    So, be attentive.
    
    
    


    23.Expressions of highlighting.

    
    	You can highlight with color in current field the records
    adequate certain condition. For example,
    
    		Alt+B BirthDate > CTOD('01/01/1960')
    
    	The color is defined by 6 and 7 pair of primary color of edition.
    Bear in mind, that the deleted records are shown by 4 and 5 pair.
    
    	To change color is possible having corrected variable _bm
    (see below) through the task of expressions or menu (File - Settings -
    Colors).
    
    	To return standard colors you should press Alt+Shift+B.
    
    
    


    24.Jobs with the clipboard.

    
    	The exchange buffer is supported. It work in a mode VIEW and
    in a mode GET. For recording of value of the current cell in mode VIEW or
    current value of edition - press Ctrl+GreyPlus. For input in a cell
    (at conformity of types) - Alt+GreyEnter or Ctrl+GreyMinus.
    
    	It is possible to make operations	+ - * /
    directly with clipBoard and current cell (last 2, naturally, only with
    numerical values), pressing Alt+corresponding Grey. It is possible to
    see the current value of ClipBoard by pressing Ctrl+Enter.
    
    	In a mode of editing of memo-fields the writing from clipBoard
    is accessible. During a showing of result of calculation, summation, etc
    is accessible record calculated in ClipBoard. However, it is possible
    and directly save result in a field.
    
    	The operations of entering in the buffer are accessible and at
    a showing of results operations.
    
    	It is very convenient to use ClipBoard for the giving various
    conditions. For example, you have set long expression of search. Remember
    it by Ctrl+Grey+. Now you want to copy all records, satisfying to this
    condition. Proceed in dialogue of copying and at inquiry conditions press
    Ctrl+Grey-.
    
    	In Win9* (not NT!) Windows ClipBoard is accessible. It is
    possible to copy the current field there (and therefrom). These
    operations is accessible by pressing Ctrl+Ins, Shift+Ins.
    
    
    


    25.History of conditions and expressions.

    
    	All conditions, expressions, lists of fields, are given during
    a session the works, and also results of calculations, summation,
    calculations are brought in a history, thus the control on doubling will
    be carried out. Accordingly, at the task of conditions and expressions,
    it is possible to use this history.
    
    	F4 (Ctrl+Down) calls a history of the current condition,
    	Alt+F4 (Ctrl+Shift+Down) - history of all conditions,
    	Ctrl+F4 - history of results.
    
    	The unnecessary conditions can be erased by pressing
    		F8 or Ctrl+D.
    
    
    


    26.Stack of positions.

    
    	It is possible to remember up to 10 positions (records) in base
    and to pass to them when need. Such opportunity is feature for the text
    editors; I do not know, as far as it will be useful here. Nevertheless,
    WordStar and Borland "were plundered" and by Ctrl+K+ 0.. 9 the bookmarks
    are established. They can be restored by Ctrl+Q+ 0.. 9. After pressing
    Ctrl+K or Ctrl+Q pressing 0.. 9 is expected within 20 seconds, then is
    reset.
    
    


    27.Edition of memo-fields and external files.

    
    	It's possible to use the internal or external editor for edition
    of memo-fields, and also external files (by pressing F4 in filer or
    through the menu "File" - "Modify text"). The internal editor uses
    standard function MemoEdit and works when variable _MemoEditor is not
    given (for example, in an ini-file). Variable can be given as String, for
    example, _MemoEditor:='c:\medit\me.exe' (then always will be used
    MultiEdit) or as an array of arrays:
    
    	{Field's Mask,			// f.e "BM*"
    	 External editor,		// f.e. "ME"
    	 Shift in a memo-field,		// by default 0 - whole field
    	 The additional options,	// by default are absent
    	 Temporary file			// by default $$BDBF$$.COM }.
    
    	The external editor can be not given, then it is supposed, that
    the program(for example, screen-saver) resides in a memo-field, and this
    program simply is started. The shift in a memo-field is necessary to set,
    if the memo-field keeps the diverse information. For example, animals.dbf
    in Delphi's distributive contains a field BMP, where a picture is stored
    from 9 positions.
    
    Example:
    	_MemoEditor:={	{'BMP', 'pv', 9, '/d'},;
    			{'SAVER', '', 0, ",'tmp.com"},;
    			{'*','ME ', 0, "};
    		     }
    	So, PV.EXE will be called on a field with the name BMP,
    the field SAVER contains executable programs, and for edition all rest
    will be called MultiEdit.
    
    	The internal editor can't edit files with the size more than
    64K. But also at use of the external editor it is necessary to remember,
    that the memo-fields of a format DBT are not capable to store the section
    more 64K. If your file has large length, at recording it in a field of a
    format DBT it will be cut off.
    
    
    


    28.Printing forms.

    
    	Besides a usual printing on F2, since the version 1.13,
    it is possible to use special definitions for a report forms. Form are
    stored in usual textual files and contain instructions for definitions of
    columns, groupings, summarizing, etc.
    
    	Report forms can use the following variables:
    
    	_aExpr - array of expressions for each column.
    	_aHead - array of column's headings. Default == _aExpr
    	_aElen - array of column's widths. Default = width of a field
    
    	If _aElen is default, width of a column is defined as maximal
    between _aElen, width of column heading and _aPict for this column. If
    width of a field is more, than width of a column, it is made correct
    carry (up to 10 lines in a column) on separators:
    		space tabulation . , ; ? !
    
    	_aPict	 - array of pictures for each column.
    
    	_aTitle	 - report title. Default - nothing. Can be given as a
    		   string or array of strings.
    
    	_cFile	 - output file. Default - name of base + '.PRN'.
    
    	_aSum	 - array of necessity of summation for each column.
    
    	_fCondit - print condition.
    
    	_aFooter - name of additional procedure printing a form footer or
    		   array containing the footer.
    
    	_pEveryStep - name of additional procedure or block called
    		      before a printing of each line satisfying to a
    		      condition _fCondit
    
    	_aGroup - array specifying report group.
    		Structure of a array:
    		{
    		<expression of grouping>,;
    		[<an array or block for a printing of group heading>],;
    		[<an array or block for a printing of group footer>]
    		[<logical: print the group sum only if more than 1 element
    		 are in group>]
    		}.
    		Default for group heading:
    			'Code' + <expression of a grouping>.
    		Default for group footer: "Total:".
    		Default for a printing of the sum: .F. (to print the sum
    		always).
    
    	_nDouble - attribute of necessity of a printing in two columns on
    		   a sheet. If 0 or is not given - one is printed. If
    		   numerical parameter is given - is perceived as
    		   amount of blanks between two columns.
    
    	_NoShow - don't offer a file for viewing and printing.
    
    	_aPage - array specifying grouping on page.
    		Structure:
    		{
    		 [<an array or block for a printing of page heading>],;
    		 [<an array or block for a printing of page footer>]
    		}.
    	If it's determined, the totals of page are printed. Header
    	of page is printed, since second.
    
    	cDivideT, cDivide - delimiter of columns in the header and
    		information lines accordingly (default - ':').
    
    	_nCounter - if > 0, a serial line number is printed at the left
    		    side of sheet (with width _nCounter).
    
    	CountName - name of a column for serial number (default "NN").
    		    It is meaningful only if _nCounter > 0 is given.
    
    	_PrintZero - whether to print of zero values, by default - .F.
    
    Following variables can be additionally adjusted directly from the
    programs (by pressing F9 in dialogue of a beginning of a printing).
    
    	Printing of heading on each page	_NeedHeadPage
    	Printing of numbers of pages		_NeedPrPage
    	Page eject after each sheet		_NeedEject
    	Starting sequence of the printer	_PSCode
    	Final sequence of the printer		_PECode
    	The left margin				_LMargin
    	Page length (0=tape)			_Plength
    	Whether to print the standard heading	_NeedMainHead
    	The printer device			_printer
    	Whether to append to a file		_NeedApFile
    
    
    Report-form files have standard extension .BPF and can be loaded through
    the menu "Base" - "Read report template".
    
    See also example in BDBFS distributive.
    
    
    


    29.Keyboard codes.

    
    	By pressing the keys, pay attention to the left top corner,
    where their codes are shown. So, it is possible to find out a number codes
    are absent in Clipper documentation.
    
    
    


    30.User menu.

    
    	Besides the general menu, in BDBFS it is possible to define
    the additional user menu accessible by F12. For this purpose it is
    necessary in ini-file to define two arrays: UserMenuPrompts and
    UserMenuActs. First it is necessary to fill by lines offered on a choice
    in the menu, in second - by the appropriate blocks of a code. For example,
    you want to have an opportunity to start FoxPro from BDBFS. Then in
    BDBFS.INI it is necessary to write down:
    
    	UserMenuPrompts: = {'Call FoxPro '}
    	UserMenuActs: = {{|| BliRun('Fox.exe')}}.
    
    	Some examples are in Examples.Ini.
    
    
    


    31.Header checking.

    
    	 You can check the size of current base from menu "File -> Check
    Header". 3 numbers are compared: logical size (is calculated basing on
    structure and records size), "header" size (based on records number in
    base header) and real disk file size. If all sizes are equal, OK message
    will be shown. Besides, you'll be prompted for choice one of these sizes.
    Rest will be synchronized. I recommend logical size as most accurate
    (in common case).
    
    
    


    32.Plug-ins.

    
    	 "Plug-ins" of bdbfs are usual ini-files (see ch.16), realizing
    some completed function. Some examples (probably useful) are in
    PLUGINS\ directory. Send me your plug-ins, best will be published.
    
    	Bdbfs searches for Plug-ins (and #include)-files:
    		- in current directory;
    		- in directories supplied in global variable _PlugDir
    		  (default - <place of bdbfs.exe>\plugins). You can
    		  define(f.e. in bdbfs.ini) more than one directory:
    			_PlugDir:='c:\bdbfs\plugins; d:\MyOwn\plugins'
    		- in directories specified in the INCLUDE environment
    		  variable.
    
    	You can use the plug-ins as usual function, if they have default
    extension .INI.  Suppose, you have MyPlug.ini.
    It is then possible, f.e.:
    
    	{?} MyPlug()			//Calculate current
    
    	{CTRL+F5} xVar:=MyPlug()*2      //Assignment
    
    	{F7} MyPlug() > 100		//Searching
    
    Plug-in could have up to 5 parameters.
    
    	Example:
    		MyPlug(2,3,'Hello')
    
    	If you need call the plug-in from another plug-in, or plug-in
    has non-standard extension, you should use the function RestoreIni().
    
    	Example:
    		RestoreIni('MyPlug',2,3,'Hello')
    
    
    


    33.Start BDBFS.

    
    	You can use the mask (with symbols * and ?) at starting.
    The files will be offered for a choice.
    	Example:
    		 BDBFS *.Str
    Files with extension STR will be offered.
    
    	Parameter /i = <indexname> sets loading a file together with
    specified index.
    
    	Parameter /BW adjusts colors to monochrome.
    
    	The order of parameters /BW and /i = can be alternated.
    
    	At start with a parameter - name of a file of an environment
    the attempt is made to restore this environment. Similarly, with a file of
    initialization - see ch.15 and ch.16.
    
    	Example:
    	 	BDBFS Envr.mem
    
    
    	The parameters /NTX /CDX /MDX /NSX set the default RDD (usually
    it defined in bdbfs.ini). You can use also /SIX[driver] form.
    
    	Examples:
    		BDBFS MyBase /SIXNSX
    
    		BDBFS MyBase /ntx /i=char
    
    	The parameter /CREATE allows to begin the work with a creating of
    a new database.
    
    	Example:
    		BDBFS MyNew /CREATE
    
    
    	Besides there are some parameters forcing BDBFS to work in
    batch mode - REINDEX, HTML, PACK, CHECK and variety of STRUCT_ parameter.
    In batch mode BDBFS carries out given operation and finishes the work.
    
    
    	Parameter REINDEX causes reindexing of a base. A compound index
    (CDX, NSX, MDX) reindexes automatically, for reindexing of simple index
    it should be specified in third parameter with a key /i. If any
    index is not found, the appropriate message will be shown.
    
    	Examples:
    		BDBFS f_w_cdx REINDEX
    		BDBFS f_w_ntx /REINDEX /i=MyNtx.ntx
    
    
    	Parameter HTM (HTML) causes production of a HTML file.
    
    	Examples:
    		BDBFS MyDbf HTM			//MyDbf.htm is generated
    		BDBFS MyDbf /HTML=e:\1		//e:\1.htm is generated
    
    	If HTML file exists you will be asked for rewriting.
    So if you wish to rewrite existing HTML without confirming, destroy it
    before!
    
    
    	Parameter PACK causes packing of a base.
    
    
    	Parameter PRINT causes initialization of BPF-file (see ch.28).
    
    	Examples:
    		BDBFS Customer /PRINT		//Customer.BPF used
    		BDBFS Customer /PRINT=Annual	//Annual.BPF used
    
    	Parameter STRUCT_ allows to execute all file operations with
    database structure, usually allowable from DISPLAY STRUCTURE mode (Alt+F2).
    	Variety of parameter:
    		STRUCT_PRINT	- print the structure description to
    				  print device
    		STRUCT_FILE	- print the structure description to
    				  file (database.STP)
    		STRUCT_EXTENDED	- create the file in COPY STRU EXTENDED
    				  format (database.STE)
    		STRUCT_COPY	- create the empty file of same structure
    				  (database.STR)
    		STRUCT_PROGRAM	- create the program generating this
    				  structure and tags of compound index,
    				  if it exists (database.STG).
    
    	All postfix of STRUCT_ parameter can be reduced up to 4 symbols.
    
    	Example:
    		BDBFS MyDbf /STRUCT_PROG
    
    
    	Parameter CHECK causes testing of a base size (see ch.31).
    
    
    	Parameter FORCED causes "forced" mode (see ch.34).
    
    	It is possible to apply the command FOR to work with the
    catalogue.
    
    	Examples:
    // Reindex all
    		FOR %a in (*.DBF) DO bdbfs %a REINDEX
    
    // To create HTMLs in subdirectory _HTMLS_
    		echo y | DEL _HTMLS_\*.HTM
    		FOR %%a in (*.DBF) DO bdbfs %%a HTM=_HTMLS_\%%a
    		REN _HTMLS_\*.DBF _HTMLS_\*.HTM
    
    The happy owners of 4DOS can save the command (and time):
    		DEL /y _HTMLS_\*.HTM
    		FOR %a in (*.DBF) DO bdbfs %a HTM=_HTMLS_\%@NAME[%a]
    
    //To make the database documentation
    		FOR %%a in (*.DBF) DO BDBFS %%a /STRUCT_FILE
    		ECHO Databases of system > All_Dbf.txt
    		FOR %%a in (*.STP) DO COPY All_DBF.TXT+%%a All_Dbf.TXT
    		DEL *.STP
    
    
    


    34.Forced mode.

    
    	BDBFS supports different formats of DBF via so called RDD of
    CLIPPER. On the other hand, many formats recently have appeared, which are
    not supported via RDD (at least, I haven't such RDD).
    	They are: new fields and headers of Visual FoxPro, dBASE5, FlagShip,
    FlexMemo. Besides, there are some programs, calling the fields "wrongly",
    f.e. beginning with figure.
    	Therefore, I wrote the special "forced" mode in BDBFS, allowing
    to process such bases without RDD. For this purpose the heading of base
    is corrected "in flight" to supported of RDD and is restored after all
    works.
    
    	So, in "forced" mode BDBFS supports the following formats:
    
    	- Visual FoxPro (field types Currency, DateTime, Binary, Integer,
    	  Double, Picture, General, new memo-format, new header format);
    	- dBASE4, dBASE5 (field type Bitmap, new headers);
    	- FlagShip (field types 2,4,8, new headers);
    	- FoxBase 1.0 (old header);
    	- FlexMemo (new memo-format);
    	- and, potentially, all another possible (and unknown to me)
    	  field types, which will be processed as Character in this case.
    
    	Non-standard field names are transformed by the following rules:
    
    	- if there are Code Page FoxPro 1200-1299 in header,
    	  AnsiToOem() executed;
    	- non-alphabetical and non-digital symbols are replaced
    	  by symbol "_".
    	- if the name begins with figure, it is anticipated with "_".
    
    	"Forced" mode can be applied also for processing of bases with
    "long" (>64K) memo-fields, as use of standard drivers in this case causes
    the internal error of Clipper.
    
    	For today the following restrictions work:
    
    	- the base is used only in an exclusive mode;
    	- PACK-operation is prohibited if the base contains memo-fields;
    	- MODIFY STRUCTURE-operation is prohibited;
    	- in a memo-field it is possible to write down up to 64K
    	  and standard way SX_Blob2File/SX_File2Blob does not work.
    
    	"Forced" mode can be activated from command line via parameter
    /FORCED (f.e. bdbfs MyBase /forced) or by setting of variable _lForced:=.T.
    in ini-file.
    
    	 For access to some "non-standard" types of fields (f.e., at use
    in expressions, searches) it is necessary to use special functions (usual
    edition, viewing, replacement of additional efforts not require):
    
    	- Memo, Picture, Bitmap - types
    		MemoSrc(<field_name>) - returns the string
    	- Currency - type
    		YToCurs(<field_name>) - returns the number
    	- DateTime - type
    		TToC(<field_name>) - returns the string
    	- Binary - type
    		CToF(<field_name>) - returns the number
    	- 2 - type
    		Bin2I(<field_name>) - returns the number
    
    	Example:
    // Set filter to field Cur1 of type "Currency"
    
    	   Alt+F YToCurs(Cur1)>100
    
    	Once again I remind, for processing of base in the forced mode,
    it is necessary to correct its heading! Therefore, if, f.e., the power
    will be lost or current window will be closed during the works, the
    structure of base will be corrupted (in case of Visual FoxPro even rather
    essentially).
    	     
    SO, USE THIS MODE AT OWN RISK!


    35.Video-modes.

    
    	BDBFS correctly supports all earlier established text modes -
    from 40*25 up to 132*60 etc.. However, if you have started from under
    BDBFS the program, changing a mode of the screen - troubles are possible.
    
    
    


    36.What is absent in BDBFS in comparison with "competitors".

    
    	I had seen in products of similar purpose some features are
    absent now in BDBFS.
    
    	Their list:
    
    	* A calendar - I don't see sense, IMHO it isn't ORGANIZER, but
    	  your opinion...
    	* The export / import 1-2-3 - IMHO it is too specialized.
    	* The calculation of statistical such as deviation etc. - is
    	  similar previous item.
    	* The diagrams on fields of base - will not be, IMHO this
    	  feature of special-programs.
    	* the viewing of the screen DOS - may be...
    
    	I'll be grateful for any opinions in this occasion.
    
    
    


    37.Known problems.

    
    	Besides again found out mistakes, there is a number of known
    problems, which, probably, will be eliminated in the future.
    
    	- the new formats of Visual FoxPro,DBASE4,DBASE5,FlagShip,FlexMemo
    	  are supported in "forced" mode (see ch.34);
    
    	- #define with parameters in ini-files is not supported;
    	- #xCommand with more, than one parameter is not supported;
    
    	- problems with MDX indexes (restriction of the driver):
    	  - the wildseek in indexes is not accessible;
    	  - number of a key in an index and quantity of records in
    	    the filter (without calculation) are not accessible. It is
    	    reflected in correctness of indicators showing;
    
        - long names in filer are shown up to 16-symbols.
    
    	- a nonrestorable mistake "Disk overflow" during COPY or APPEND
    	  operation.
    
    	- due to mistake in realization of TBROWSE object,
    	  not all fields in base can be shown. By default,
    	  quantity of fields, are shown in BDBFS is limited to 170
    	  (experimental limit on my computer is 173). You can
    	  experiment by setting _nBrowMaxField variable in a INI-file.
    
    	- internal error 1112. It appears on database with
    	  long memo-fields (more than 64K). It's Clipper 5.2 fault (in
    	  5.0 it wasn't). You can exclude such fields from viewing
    	  in AutoOpen files (see ch.16) (and access them via
    	  Sx_Blob2File() function) or use "forced" mode (see ch.34).
    
    	- FoxPro's indexes with expression like alias.field instead
    	  alias->field cause the error when index field is changed.
    
    	- noncompact IDX-s are not supported (restriction of SIX3
    	  driver).
    
    	- SEEK doesn't work in FoxPro indexes made with established
    	  SET COLLATE.
    
    


    38.Gratitudes.

    
    	To Nantucket (to CA essentially I'll not be), American
    Cybernetics, Assembler Software, Borland, SuccessWare - for the
    used products.
    
    	To authors of Clipper echo-conferences & NanFor.LIB.
    
    	To all people, who sent bag reports and proposals.
    
    	Special gratitude to L.Kujiy for careful testing and number of
    the efficient offers.
    
    	To Phil Barnett for extremely useful Clipper oasis and a lot of
    interesting programs.
    
    	To Tom Claffy for the used code of FileBrowse.
    
    	To Dark Black Software for Long Name support library.
    
    	To Yury Hnykin uri@itk.ru for
    unvaluable help in translation to CLIP.
    
    
    


    39.FeedBack.

    
    	Any questions, suggestions or bug-reports send me to:
    
    		E-Mail	elb@lg.bank.gov.ua
    				Or
    		Bondar_Eugen@yahoo.com
    
    		Bondar Yevgen,
    		91024,
    		Leningradskaya 8,
    		Lugansk, Ukraine
    
    	For newest version refer to  my web-page
    
    
    


    40.The form of distribution.

    
    	BDBFS for CLIP is distibuted under GPL.
    
    
    


    SUPPLEMENT I. List of hot-keys.

    
    	Remember, that some functions are accessible only through the menu.
    
    	 
    A.Main VIEW mode.
    
    	
    Positioning:
    
    		Up Down Left Right PgUp PgDn
    
    	On last field			Ctrl+End
    	On the first field		Ctrl+Home
    
    	Go top				Ctrl+PgUp
    	Go Bottom			Ctrl+PgDn
    
    	To top of next page		Alt+PgDn
    
    	To top of previous page		Alt+PgUp
    
    
    	
    Function of management:
    
    	To call the main menu			F10, Alt+V
    	To call the user menu			F12
    
    	To choose the base			F4
    	To open previous base			Ctrl+O
    
    	To establish the index file		F5
    	To reindex				Alt+F5
    	To index for				Alt+F9
    
    	To add record				F3, Ins
    	To add with copying			Alt+F3
    	To insert new record			Shift+F3
    
    	To count records			Ctrl+F6
    	To summarize the current field		Alt+F6
    	Total on current index expression	Alt+Shift+F6
    
    	To replace the current field by expression	Alt+R
    	To replace a field in all records with:
    			constant expression		Alt+F4
    			varied expression		Ctrl+F4
    
    	Same but with confirming			Alt+Shift+R
    							Alt+Shift+F4
    							Ctrl+Shift+F4
    
    	To edit one record (EDIT)		Alt+E
    
    	To edit a symbolical field		Alt+W
    	as a memo-field (for wide fields)
    
    	Information about base and environment	Alt+F1
    	To show / print base structure		Alt+F2
    
    	To attach from base (text)		Ctrl+F9
    	To copy to base (text)			Ctrl+F3
    	To copy with MEMO converting		Ctrl+Shift+F3
    
    	To sort					Alt+S, Ctrl+F11
    	To establish the filter			Alt+F, Alt+F11
    
    	To print base [in a file]		F2
    	To print record [in ]		Alt+P
    
    	To modify structure			Shift+F2
    	To establish fields and headings	Ctrl+F2
    
    	"To freeze" the current field		Alt+Z
    	and all fields more to the left
    
    	To establish a condition of illumination	Alt+B
    	Restore color					Alt+Shift+B
    
    	To make HTML				Alt+>
    
    
    	
    Functions of search:
    
    	To go to record NN			F6
    	To search key in an index (Seek)	F9
    	To search for a condition (Locate)	F7
    	To continue search			Alt+F7
    	To search in all fields at once		Alt+I
    	(contextual search)
    	To continue contextual search		Alt+Shift+I
    	To search in current field		F11
    	(especially for non-experience users)
    	To search for a maximum / minimum	Alt+M
    	To search for a longest value		Ctrl+L
    	in a text field
    	To search for a double in an index	Alt+2
    	WildSeek in index			Alt+[
    	To continue wildseek			Alt+Shift+[
    
    
    
    Deleting / recalling
    
    	To delete / recall current record	Del, Ctrl+T
    	To delete for a condition		Ctrl+F8
    	To restore for a condition		Ctrl+F7
    
    	To pack					F8
    	To clear all (Zap)			Alt+F8
    
    	To clear the current field		Shift+F4
    	To clear all fields of record		Ctrl+Y
    
    
    
    Buffer of an exchange
    
    	To write down into WIN clipboard	Ctrl+Ins
    	To write down from WIN clipboard	Shift+Ins
    	To write down into internal clipboard	Ctrl+Grey+
    	To write down from internal clipboard	Ctrl+Grey-, Alt+GreyEnter
    	ClipBoard:=Clipboard+Field		Alt+Grey+
    	ClipBoard:=Clipboard-Field		Alt+Grey-
    	ClipBoard:=Clipboard/Field		Alt+Grey/
    	ClipBoard:=Clipboard*Field		Alt+Grey*
    	To show the clipboard			Ctrl+Enter
    
    
    
    Other
    
    	To finish jobs				Esc
    	To finish without confirmation		Alt+X
    
    	Exit to DOS				Alt+F10
    	To replace a disk and directory		Ctrl+F10
    
    	To execute macro-function		Ctrl+F1
    	To establish variable			Ctrl+F5
    	To calculate expression			Shift+F6, Alt+G, ?
    
    	To translate in lower case		Alt+L
    	To translate in capital			Alt+U
    	Capitalization				Alt+K
    	To transform English->National		Alt+Q
    	To transform National->English		Alt+Y
    
    
    To copy a field from
    				above		Alt+Up
    				below		Alt+Down
    				left		Alt+Left
    				right		Alt+Right
    
    
    To exchange record with
    			above record		Ctrl+Up
    			below record		Ctrl+Down
    
    
    To exchange the field with
    			above record		Alt+Shift+Up
    			below record		Alt+Shift+Down
    
    	To set a bookmark			Ctrl+K + 0..9
    	To pass to a bookmark			Ctrl+Q + 0..9
    
    
    	To save environment			Shift+F1
    	To restore environment			Shift+F5
    	To save environment in AutoOpen file	Ctrl+Shift+F1
    
    	To load ini-file			Ctrl+F12
    
    	Filer					Alt+F12
    
    	To refresh (in network)			Ctrl+R
    
    	To undo changes				Ctrl+U,Alt+BS
    
    
    
    Jobs with compound indexes (CDX, MDX, NSX)
    
    	To choose TAG				Alt+T,Shift+F12
    	To set TAG number			Shift+F7
    	To set TAG name				Shift+F8
    	To make new TAG				Shift+F9
    	To remove TAG				Shift+F10
    	To establish another CDX		Shift+F11
    
    
    
    	 
    B. GET mode
    
    
    Positioning
    
    		Up Down Left Right PgUp PgDn
    
    	Next field				Tab
    	Previous field				Shift+Tab
    
    
    Functions of management
    
    	To add record				F3
    	To switch a mode of an Ins/Ovr		Ins
    	To clear the current field		Ctrl+Y
    	To finish input without saving		Esc
    	To finish input with saving		Enter, Ctrl+W, Ctrl+End
    	To cancel changes			Ctrl+U
    
    	To switch a mode of input		F4
    	(see topic 1)
    	To play macro from "MACRO"		Ctrl+F1
    
    	To copy a field from above		Alt+ Up
    	To copy a field from below		Alt+ Down
    
    	To translate in lower case		Alt+L
    	To translate in capital			Alt+U
    	Capitalization				Alt+K
    	To transform English->National		Alt+Q
    	To transform National->English		Alt+Y
    
    	To write down into WIN clipboard	Ctrl+Ins
    	To write down from WIN clipboard	Shift+Ins
    	To write down into internal clipboard	Ctrl+Grey+
    	To write down from internal clipboard	Ctrl+Grey-, Alt+GreyEnter
    
    	To delete / recall current record	Shift+Del
    
    
    	 
    C. SET FIELDS mode
    
    	To remove a field from the list		DEL, Ctrl+Y
    	To change the fields order		Ctrl+Down, Ctrl+Up
    	To restore the previous settings	F5
    	To switch a mode of sorting		F6
    	To finish changes			F10
    	To cancel changes			Esc, Alt+X
    
    
    
    	 
    D. MODIFY STRUCTURE mode
    
    
    	To change value (if it's possible)	Enter
    	To add a new field			F3
    	To remove a field			F8
    	To insert a field before current	F5, Ctrl+N
    	To establish the necessary type		C, N, D, L, M, V, F
    	(when cursor in File_Type)
    	To optimize a structure			F9
    	To finish and to save changes		F10
    	To cancel changes			Esc
    
    
    	 
    E. VIEW STRUCTURE mode
    
    
    	Output to a printer				F2, Shift+Tab
    	Output to a text file (*.STP)			F4
    	Output to a file with structure (*.STR)		F6
    	Output to a file with the extended		F5
    	structure (*.STE)
    	Configure of a printer				F9
    	Create a program generating this structure	F10
    	and tags of compound index (*.STG)
    	Moving to this field				Enter
    
    
    	 
    F. DIALOGUES mode
    
    
    
    To select expression from
    		this condition history		F4, Ctrl+Down
    		common condition history	Alt+F4, Ctrl+Shift+Down
    		results history			Ctrl+F4
    
    	To insert a name of the current field		F2
    	To insert a name of any field			Ctrl+F2
    	To insert heading of the current field		F3
    	To insert heading of any field			Ctrl+F3
    	To insert value of the current field		F5
    	To insert the name of the current base		F6
    	Menu of input					F10
    
    	In dialogue REPLACE of a symbolical field
    	Menu of functions				F7
    
    	In dialogue of fields defining
    	(COPY, SORT) - select fields			Alt+F2
    
    
    	 
    G. VIEW RESULT mode (after calculation, summation etc.)
    
    
    	To continue with result				F2
    	To write a result to the current field		F5
    	To write a result to the buffer			Ctrl+Ins
    	Menu of writing					F10
    
    
    	 
    H. MEMOEDIT mode (wide edit)
    
    
    	To print					F2
    	To save as file					F3
    	To load from file				F4
    	To switch a mode of line's auto-wrapping	F5
    	To insert a Windows clipboard in the
    	current position				F6,Shift+Ins
    
    	To tune some system variables			F9
    	To insert internal clipboard in the		Ctrl+Grey-
    	current position.
    	To delete the current line			Ctrl+Y
    	To delete word right				Ctrl+T
    	To reform current paragraph			Ctrl+B
    	To write down all changes			F10 (Ctrl+W)
    
    
    


    SUPPLEMENT II. THE MESSAGES.

    
    	At opening base the following messages can be given:
    
    	<FileName > - is damaged or is blocked.
    	The heading of base is damaged or the base is locked by
    	other process, or the base is marked as Read Only
    	(I remind - BDBFS is Editor!).
    
    	<a name of a file > - is damaged.
    	There are damages to the list of fields of base or there are
    	unsupported field type.
    
    	< a name of a file > - incorrect format.
    	It is absolutely not DBF on structure or it is base with
    	unfamiliar type of a field. Try:
    		 BDBFS < a name of a file > /FORCED
    
    
    


    SUPPLEMENT III. Supported functions.

    As it was already noticed, it is possible to use almost all system Clipper Functions. AADD ABS ACHOICE ACLONE ACOPY ADEL ADIR AEVAL AFIELDS AFILL AINS ALIAS ALLTRIM ARRAY ASC ASCAN ASIZE ASORT AT BIN2I BIN2L BIN2W BOF BREAK CDOW CHR CMONTH COL CTOD CURDIR DATE DAY DAYS DBAPPEND DBCLEARFILTER DBCLEARINDEX DBCLEARREL DBCLOSEALL DBCLOSEAREA DBCOMMIT DBCOMMITALL DBCREATE DBCREATEINDEX DBDELETE DBEVAL DBF DBFILTER DBGOBOTTOM DBGOTO DBGOTOP DBRECALL DBREINDEX DBSEEK DBSELECTAREA DBSETFILTER DBSETINDEX DBSETORDER DBSETRELATION DBSKIP DBSTRUCT DBUNLOCK DBUSEAREA DELETED DESCEND DEVOUT DEVPOS DIRECTORY DISKSPACE DISPBOX DOW DTOC DTOS ELAPTIME EMPTY EOF EVAL EXP FCLOSE FCOUNT FCREATE FERASE FIELDGET FIELDNAME FIELDPUT FILE FLOCK FOPEN FOUND FREAD FREADSTR FRENAME FSEEK FWRITE GETE GETNEW HEADER I2BIN IF INDEXKEY INKEY INT ISCOLOR ISPRINTER L2BIN LASTKEY LASTREC LEFT LEN LENNUM LOG LOWER LTRIM MAX MAXCOL MAXROW MEMOEDIT MEMOREAD MEMORY MEMOWRIT MIN MOD MONTH NETERR NEXTKEY PAD PADC PADL PADR PCOL PCOUNT PROCNAME PROW QOUT QQOUT RAT READEXIT READKEY READMODAL READVAR RECCOUNT RECNO RECSIZE REPLICATE RESTSCREEN RIGHT RLOCK ROUND ROW RTRIM SAVESCREEN SCROLL SECS SECONDS SELECT SET SETBLINK SETCOLOR SETCURSOR SETKEY SETPOS SOUNDEX SPACE SQRT STR STRTRAN STRZERO STUFF SUBSTR TBCOLUMNNEW TBROWSEDB TBROWSENEW TIME TONE TRANSFORM TSTRING TYPE VAL VALTYPE UPDATED UPPER USED WORD YEAR, and also part of the special not documentary functions beginning with __. Experience clipper's-men will understand me, others will not use all the same. Specially for "experience"! I do not guarantee, that all of "__" functions always will be behave how you have got used. The part from them was rewritten in the special purposes. SIX Functions BAG2TAG SXCHAR SXDATE SXLOG SXNUM SX_BLOB2FILE SX_DATEVAL SX_DBFDECR SX_DBFENCR SX_DECRYPT SX_DTOP SX_ENCRYPT SX_FILE2BLOB SX_FILEORDER SX_FINDREC SX_FNAMEPARSER SX_GETLOCK SX_IDTYPE SX_INDEXCOUNT SX_INDEXNAME SX_ISFLOCK SX_ISLOCKED SX_ISREADONLY SX_ISSHARE SX_KEYADD SX_KEYCOUN SX_KEYDATA SX_KEYDROP SX_KEYGOTO SX_KEYNO SX_KILLTAG SX_MEMOBLK SX_MEMOEXT SX_ORDERCOUNT SX_PTOD SX_RLOCK SX_SETFILE SX_SETMEMOBLOCK SX_SETPASS SX_SETTAG SX_SLIMFAST SX_TABLENAME SX_TABLETYPE SX_TAGCOUN SX_TAGINFO SX_TAGNO SX_TAGS SX_TAGUNIQ SX_VALDATE SX_VFGET SX_WILDMATCH SX_WILDSEEK M6_ADDSCOPED M6_CHGOWNER M6_DBEVAL M6_DBFILTER M6_FILTADDREC M6_FILTCHGREC M6_FILTCOPY M6_FILTCOUNT M6_FILTDROPREC M6_FILTINFO M6_FILTINVERSE M6_FILTJOIN M6_FREEFILTER M6_GETAREAFILT M6_ISFILTER M6_ISFILTREC M6_ISOPTIMIZE M6_NEWFILTER M6_RECCOUNT M6_REFRESHFILT M6_ORDCOND M6_ORDCREATE M6_SET M6_SETAREAFILT M6_SETFILTER M6_SETTEMP Nantucket Forum Functions FT_AADDITION FT_AAVG FT_ADESSORT FT_AEMAXLEN FT_AEMINLEN FT_AMEDIAN FT_ANOMATCHES FT_ASUM FT_AT2 FT_BYT2BIT FT_BYT2HEX FT_BYTEAND FT_BYTENEG FT_BYTENOT FT_BYTEOR FT_BYTEXOR FT_BITCLR FT_BITSET FT_D2E FT_DEC2BIN FT_DOSVER FT_E2D FT_ELAPSED FT_FDAY FT_FINDITH FT_GCD FT_GETE FT_GETMODE FT_INT86 FT_ISBIT FT_HEX2DEC FT_ISBITON FT_ISPrint FT_LASTKEY FT_LDAY FT_MADD FT_METAPH FT_NOOCCUR FT_PUTKEY FT_ORIGIN FT_RAND1 FT_ROUND FT_SQZN FT_SYSMEM FT_TEMPFIL FT_UNSQZN FT_WORKDAYS FT_XTOY Netto Functions FN_BIN2HEX FN_BIN2I FN_CONNID FN_CONNINF FN_CONNNUM FN_DEFCID FN_DEVTYPE FN_ERROR FN_FSNAME FN_GETSN FN_HEX2BIN FN_I2BIN FN_INETADD FN_NAMEL FN_NETVER FN_NONULL FN_OBJCNUM FN_PEEKSTR FN_PFCONID FN_POKESTR FN_PRCONID FN_SPFCID FN_SPRCID FN_STAADDR FN_WHOAMI FN_WRCONNI FN_WRFSNAM FoxPro Functions ALEN ANSITOOEM ATC BETWEEN CDX CEILING CHRTRAN CTOT DATETIME DMY EVALUATE FILTER FLOOR GOMONTH INLIST ISBLANK KEY NDX OCCURS OEMTOANSI PI PROPER SEEK SIGN SYS(2,3,5,6,12-16,21-23,1001,2000,2003,2012,2020,2021) Clipper Tools Functions CTOF FTOC XTOC LIKE The functions is determined specially for BDBFS are described in the SUPPLEMENT IV.


    SUPPLEMENT IV. BDBFS-PRO.

    This supplement is intended for wishing as much as possible fully to master BDBFS. This is an information about calling of BDBFS procedures and functions, and also using of internal variables.
    A. System variables.
    
    	You can somehow use in expressions (examples was above)
    	the following variables:
    								Default
    Variable conditions:						-------
    	Condition Locate			_LCONDIT	  ""
    	Expression of search			_GSearch	  ""
    	Condition Seek				_FCONDIT	  ""
    	Condition Sum				_SumCOND	  ""
    	Condition Print				_PCOND		  ""
    	Condition Count				_CountCOND	  ""
    	Condition Delete			_DelCOND	  ""
    	Condition of calculation		_ECOND		  ""
    	Condition Replace			_RCOND		  ""
    	Expression Replace			_Repl		  ""
    	Condition of the filter			_FltrCond	  ""
    	Condition of sorting			_SortCond	  ""
    	File sorting				_SortFile	  ""
    	Expression of sorting			_ckSort		  ""
    	Field of copying			_ckField	  ""
    	Condition of illumination		_cb		  ""
    	Condition of an index (tag)		_IndexFor	  ""
    	Global history of conditions		_aGlbHcond	  {}
    
    Variables of results:
    	Last sum				__Sum		  0
    	Last count				__Count		  0
    	Last result				__Go		  0
    	ClipBoard contents			_ClipText	  {}
    	Choice from it				_ClipChoice	 .T.
    	Windows clipboard OEM/ANSI		_lCnvWClip	 .T.
    	converting
    	Directory of transition			_newDir		  ""
    	Quantity of processed records		_Tally		  0
    	Global history of results		_aGlbHRes	  {}
    
    Configuration of a printing:
    	Centering of numbers			_NeedCentr	  .F.
    	Whether to print 0 when number=0	_PrintZero	  .F.
    	Whether to print numbers of records	_NeedRec	  .T.
    	Needing of heading on each page		_NeedHeadPage	  .T.
    	Needing of numbers of pages		_NeedPrPage	  .T.
    	Eject after each page			_NeedEject	  .F.
    	Starting sequence of the printer	_PSCode		  ""
    	Ending sequence of the printer		_PECode		  ""
    	Left border				_LMargin	  0
    	Length of page				_Plength	  0 (tapes)
    	Needing of standard heading		_NeedMainHead	  .T.
    	Print device				_printer	  PRN
    	Whether to append to a file		_NeedApFile	  .F.
    	Whether to summarize numerical fields	_NeedSum	  .T.
    	Width of Memo-fields			_MemoPrnt	  50
    	Maximum number of lines in Memo-fields	_MemoNumLines	  10
    	Symbol divider of cells			_DefaultBorder	   :
    
    Color scale:
    	Primary color			_Bm	'7/1,0/3,N,4/7,7/4,7+/1,7+/4'
    	Help and inquiries		_Im		'n/w+,g+/n'
    	Results				_CM		'Gr+/N,W+/B'
    	Menu				_MenuColor	'Gr+/b, g+/b'
    	Unchoosable elements of menu	HiddenColor	'w/b'
    	Headings of panels		_HdColor	'G+/b*'
    
    The interface:
    	Step of the indicator		_Sx_Step	100
    	Indicator			_lMeter		.T.
    	Editor of memo and wide fields	_MemoEditor	""  (built - in)
    	Viewer of files			_TextViewer	""  (built - in)
    	Step of tabulation in memo	_nMemoTab	8
    	Memo line length		_nMemoWrap	255
    	Gauging time of execution	_Timing		.T.
    	Width of display of file	_DirShow	16
    	names in Filer
    	Extensions associations		__aExt		{}
    	in Filer
    	(array structure: {{mask1,command1},{mask2,command2}...} )
    
    
    Other:
    	Current base			_base
    	Current index file		_oldind
    	TBrowse object			_BDBFBrow
    	Current field			_C_F
    	Current field context		__Content
    	Current tag			_TagName
    	Current cdx			__CDX
    	Mask of files			_Mask		'*.dbf '
    	Current RDD			_DefaultRDD	'SIXCDX'
    	Current memo extension		_DefaultMemo	'FPT'
    	Current cdx extension		_DefaultCDX	'.CDX '
    	User menu
    		Line			UserMenuPrompts {}
    		Action			UserMenuActs	{}
    	Auto-saving environment		_AutoSave	.F.
    	Auto-restoring environment	_AutoRestore	.F.
    	"Standard" keyboard		_Usa_Keyboard	'QWERTY......'
    	"My" keyboard			_My_Keyboard	'......'
    	DOS char set			_Oem_Set	'......'
    	WINDOWS char set		_Ansi_Set	'......'
    	Max fields in browse		_nBrowMaxField  170
    	Max UNDO count			_UndoSize	1024
    	"Forced" mode			_lForced	.F.
    
    
    
    	 
    B.Called functions.
    
    	It is possible to call any internal function BDBFS, as well as
    system in any modes. It looks more natural to use this in a mode of
    calculation (Shift+F6, Alt+G, ?),or in a mode of assignment (Ctrl+F5).
    
    	Examples:
    		Alt+G		Aver('Example')
    		Ctrl+F5	avrg=Aver('Example')
    
    	For presentation of the explanatory we shall conduct on
    	educational base
    
    	NAME	S02	S03	S04
    	Your	12	1	13
    	Your1	32	2	33
    	My	10	3	10
    	My1	30	4	0
    
    
    
    1. Functions of calculation.
    
    
    SUM( <cExpr> [, <cCond>] ) - > nResult Sum base on expression cExpr for a condition cCond. Returns Number. Examples: Alt+G (1) Sum ('S02+S03', '[My] $ Name') (2) Sum ('S02', '.t.') (1) will return 47 (2) - 84 If <cCond> is omitted, the scope is all records. Except for returned value the result is remembered in variable __Sum
    AVER(< cExpr > [, < cCond >]) - > nResult Calculates average on expression cExpr for a condition cCond. Returns Number. If second parameter is omitted, it is meant .t. Example: Ctrl+F5 MediumS2=Aver('S02', '[My] $ Name') will return 21
    COUN(< cCond >) - > nResult Counts up quantity of records satisfying to a condition cCond. Example: Ctrl+F5 CntMy=Coun ('[My] $ Name') will return 2 If second parameter is omitted, it is meant .t. Except for returned value the result is remembered in variable __count
    SumLine([<FromField>], [<ToField>]) - > nResult Summarizes fields "lengthways" records, from <FromField> up to <ToField>. Default FromField is first field, ToField - last field. The non-numerical fields are ignored. Examples: (for the first record) SumLine() - > 26 SumLine(1,2) - > 12 SumLine(3) - > 14 Except for returned value the result is remembered in variable __Go
    Like(<cEtalon>, <cTest>) Determines whether or not a character expression is contained in another expression. LIKE() returns true (.T.) if <cEtalon> matches <cTest>. <cEtalon> can contain the wildcard characters * and ?. The question mark matches any single character in <cTest> and the asterisk matches any number of characters. You can mix any number of wildcard characters in any combination in <cEtalon>. The function has shown the same high-speed results, as same function of Clipper Tools (probably, algorithm is same). But EXE is 0.5K less :-) . Examples: F7 Like ('spr*.dbf', FileName) Alt+G Like ('?m*h', 'smith') - > .t.
    Crc32(< cExpr >) Calculates the control sum of a line. The algorithm of PKZIP is used. Example: the control sum of all fields: Crc32(Name+XTOC(s02) +XTOC(s03) +XTOC(s04))
    Rand([< nExpr >]) Returns a random number in a range from 0 up to 1. From everyone ExprN the identical sequence comes back. Example: Rand(Seconds())
    Random(< nMin >, < nMax >) Returns random integer in range from nMin up to nMax. Example: Random(0,1000)
    RoundIt(<nVar>,<nPlace) Correct rounding off. Clipper not always correctly carries out operation of a rounding off. Example: Round(1.025,2) --> 1.02 RoundIt(1.025,2) --> 1.03
    2. Functions of transformation
    
    
    Capitalz(<cExpr>) - > ExprC Returns the specified character expression with initial letter capitalized and the remaining characters lowercase. Returns the empty line if parameter is absent. Example: Capitalz('LUGANSK') - > Lugansk
    OemToAnsi(<cExpr>) Converts each character in a character expression to the corresponding character in the ANSI character set (default: 1251). You can change the char set to your own, to change variables _Oem_Set, _Ansi_Set in BDBFS.INI. Example: OemToAnsi('') -->
    AnsiToOem(<cExpr>) Inverse function to OemToAnsi() .
    SplitLine(<cExpr>) Transform the specified character expression to an array. Array's elements are separated by points. Example: SplitLine('One,Two,Three') - > {'One', 'Two', 'Three'}
    dbTrans(cNewBase, Fields [, bFor, bWhile, nNext, lRest]) Copies the current base with an opportunity of renaming or transformation of fields. The list of fields is set in inverted commas (as a line), or as the array (that is necessary at the giving of expressions with points). If the calculated fields are not given in the list of fields, the function works completely as system command COPY. See also topic 5.Append/Copy of the present description. Examples: DBTrans('NewFile','Char,Num AS Digit,Num*2 AS Double') DBTrans('NewFile',{'LEFT(Char,2) AS Symbol','Num'},; {||Num # 0})
    TB2Html([cHtmlFile, cTitle, aDesign]) Transforms the current TBrowse object to a format HTML. If the name of a file is not given - it is requested. An array of colors aDesign has structure: {page background color, table background, text color for table and header, text color for deleted records}. Default: "navy","blue","white","red". Example: Tb2Html('MyBase','WWW FOREVER!',; {'fffffc0','fffff80','00000ff','black'})
    3. Other.
    
    
    ModiFile(cFileName) - > .T. at successful record Elementary text editor. As uses MemoEdit, it can edits files up to 64K. In conditions of small amount of memory, this size can decrease. Example: ModiFile('c:\config.Sys')
    Scatter() Writes down contents of the current record in a array with a name _Scatter. The attribute of deleting enters in last element of an array.
    Gather() Writes down in the current record an array with a name _Scatter, usually created by function Scatter().
    SWAP(recno1, recno2) Exchanges the contents of records with physical numbers recno1, recno2 through the internal buffer. Example: Swap(1,3)
    WORK(HEAD) - > cResult Defines the true name of a field on heading. It is useful in case of the setting of fields by Ctrl+F2, when you don't remember the real field's name, and its name should be specified, for example, in the search expression. Example: Work('My name for 2 field') - > 'S02'
    FindMax(NeedMax [, FieldName], [EvalBlock]) - > MaxVal Universal function of searching of a maximum / minimum. Parameters: NeedMax - .T., if the maximum is necessary, .F. - minimum FieldName - field or expression, by default - current field. EvalBlock - block of a code calculated for comparison, by default - value FieldName ({|i| i}) Examples: FindMax(.T.,'S02 ') - > 32 FindMax(.F.,'S02 ') - > 10 // Length the longest name FindMax(.T.,'Name ',{|i |Len(Trim (i))}) -> 5 (is found ' Your1 ')
    PrintEdit([cFileName]) Prints the current record on the device of a printing (default-printer) in an unwrapped kind. By pressing Alt+P in BDBFS - into the file with a name <CurrentBase>.Rec. Appending/rewriting of a file depends on the appropriate adjustment printer. Example: NEW.DBF Record 1 ---------------------------------------- NAME Your S02 12 S03 1 S04 13
    For(< nFrom >, < nTo >, < bEval >, < bFor > ) "FOR" cycle. Could be useful, for example, in INI-files. Codeblock bEval is executed when Eval(bFor)==.T.. The cycle variable is transferred to the bEval and bFor as parameter. bEval and bFor can be of Codeblock or Character type. Examples: cSet:='' For(1,254,{|_1|cSet:=cSet+CHR(_1)}) --> '...' nSum:=0 For(1,FCOUNT(),{|i| nSum:=nSum+FIELDGET(i)**2},; {|i| VALTYPE(i)=='N'}) nSum:=0 For(1,FCOUNT(), "nSum:=nSum+MyField**2") Some examples are in PLUGINS directory.
    While(<bCondition>, <bEval> [,<bFor>] [,<lBase>]) "WHILE" cycle. If lBase==.T., SKIP is executed after each bEval. bCondition, bEval and bFor can be of Codeblock or Character type. Example: cName:='' While( '!EOF()', {|| cName+= Name},,.T.) Result: 'YourYour1MyMy1' cName:='' While( '!EOF()', {|| cName+= Name},'s02<30',.T.) Result: 'YourMy' Some examples are in PLUGINS directory.