New FTDN January/Enero 2019 (FWH 19.01)
Posted: Mon Feb 11, 2019 1:08 pm
JANUARY 2019
============
* Samples:
- New fwfuncs.prg: Lists all functions/classes included in the FWH library
installed, along with source code. Note: The list may include internal,
obsolete and under development functions also.
* Enhancement: function FW_ArrayToDBF( aArray, [fieldlist], [bProgress], [lOverwrite], ;
[lRecallDeleted], [bTrigger] )
2. fieldlist (optional): Comma separated list or array of field names.
Default all fields. Values are written starting from the first field
till all fields or values are written.
If a fieldlist is provided, the values are written to the fields in that
order. The list can contain blanks or invalid field names and such
fields are skipped.
New parameters 4,5 and 6.
4. lOverWrite (optional default .f.)
- If set to .t., records from the current position are overwritten till
eof and remaining rows are appended.
- Current index order, scope and filter are respected while navigating.
- When an index is set, the records are navigated in the order existing
prior to overwriting the new data.
- Readonly fields with types "+", "=", "@", "I:+" are not overwritten.
5. lRecallDeleted (Optional)
Used only when lOverwrite is .t.
Defaults to .t. when SET DELETED IS OFF.
Defaults to .f. when SET DELETED IS ON.
When .t., all deleted records while navigating are recalled and overwritten.
6. bTrigger (Optional)
If specified, the codeblock is executed for every record, after writing
the data. This codeblock can use autoincrment and modify time field values.
* New: samples\elixir.prg and elixir.rc, shows how to use a TreeView to review all
folders and files.
* New: function FW_TIMEZONE( [lNegative] ) --> Timezone in format +/-HH:MM.
If the optional parameter lNegative is .t., the sign is reversed.
* New: function cRelativePath( cFullPath, [cCurrentPath] )
--> cRelativePath
Optional parameter defaults to current path.
eg: if c:\fwh\samples is the current path,
c:\fwh\bitmaps\pngs\2.png is converted as
"..\bitmaps\pngs\2.png"
* New feature: Recycling of deleted records (dbfcdx only)
-------------------------------------------------------
- To avail this feature, new records should be appended using FWH function
DBFAPPEND() --> nRecNo (Newly appended or recycled record. 0 on failure)
Example usage:
if DBFAPPEND() > 0
// assign values to fields
DBUNLOCK()
endif
instead of
DBAPPEND()
if !NetErr()
// assign values ti fields
DBUNLOCK()
endif
- New function FW_SetRecycleDeleted( uSet ) --> Previous setting
Possible values of the param are nil or .f. or .t.
a)If the parameter is NIL or the function is never called.
This is the default behavior.
DBFAPPEND() function first tries to recycled records if and only if it
has atlest one index tag with for condition "FOR DELETED()"
eg: INDEX ON RECNO() TAG RECYCLE FOR DELETED()
This index is used to quickly pick up a deleted record that can be
locked and recycles it by RECALLing and blanking all fields.
If no such record is found, a new record is appended using DBAPPEND().
If such an index tag is not available, no attempt is made to recycle
deleted records and acts like a normal DBAPPEND()
b)If the parameter is set to .F., recycling is not attempted at all even
if a "FOR DELETED()" tag exists.
c)If the parameter is set to .T., recycling is compulsorily attempted.
For pursposes of optimization,
( i) if a "FOR DELTED()" index exists, that index is used.
( ii) If an index tag with expression "DELTED()" exists, that index is used.
eg: CREATE INDEX ON DELETED() TAG DELETED
(iii) If both the indexes are not availalbe, a new index tag is created
"INDEX ON RECNO() TAG RECYCLE FOR DELETED()". If the dbf is opened
exclusively, this tag is added to the compound index and if opened
in shared mode, this tag is created temporarily in memory.
- TDatabase class adopts the same behavior while appending new records.
- TDataRow also adopts the same behaviour. So when a new record is edited
and saved, deleted records are recycled observing the above rules.
(Note this applies to oBrw:EditSource() method)
* Multiple monitor support functions:
- New function FW_GetAllMonitors() --> Array of TMonitor objects
- Fixes and enhancement to FW_GetMonitor( nthMonitor )
* Fix: RichEdit 64 bits method InsertBitmap() is ok now. It was GPFing.
============
* Samples:
- New fwfuncs.prg: Lists all functions/classes included in the FWH library
installed, along with source code. Note: The list may include internal,
obsolete and under development functions also.
* Enhancement: function FW_ArrayToDBF( aArray, [fieldlist], [bProgress], [lOverwrite], ;
[lRecallDeleted], [bTrigger] )
2. fieldlist (optional): Comma separated list or array of field names.
Default all fields. Values are written starting from the first field
till all fields or values are written.
If a fieldlist is provided, the values are written to the fields in that
order. The list can contain blanks or invalid field names and such
fields are skipped.
New parameters 4,5 and 6.
4. lOverWrite (optional default .f.)
- If set to .t., records from the current position are overwritten till
eof and remaining rows are appended.
- Current index order, scope and filter are respected while navigating.
- When an index is set, the records are navigated in the order existing
prior to overwriting the new data.
- Readonly fields with types "+", "=", "@", "I:+" are not overwritten.
5. lRecallDeleted (Optional)
Used only when lOverwrite is .t.
Defaults to .t. when SET DELETED IS OFF.
Defaults to .f. when SET DELETED IS ON.
When .t., all deleted records while navigating are recalled and overwritten.
6. bTrigger (Optional)
If specified, the codeblock is executed for every record, after writing
the data. This codeblock can use autoincrment and modify time field values.
* New: samples\elixir.prg and elixir.rc, shows how to use a TreeView to review all
folders and files.
* New: function FW_TIMEZONE( [lNegative] ) --> Timezone in format +/-HH:MM.
If the optional parameter lNegative is .t., the sign is reversed.
* New: function cRelativePath( cFullPath, [cCurrentPath] )
--> cRelativePath
Optional parameter defaults to current path.
eg: if c:\fwh\samples is the current path,
c:\fwh\bitmaps\pngs\2.png is converted as
"..\bitmaps\pngs\2.png"
* New feature: Recycling of deleted records (dbfcdx only)
-------------------------------------------------------
- To avail this feature, new records should be appended using FWH function
DBFAPPEND() --> nRecNo (Newly appended or recycled record. 0 on failure)
Example usage:
if DBFAPPEND() > 0
// assign values to fields
DBUNLOCK()
endif
instead of
DBAPPEND()
if !NetErr()
// assign values ti fields
DBUNLOCK()
endif
- New function FW_SetRecycleDeleted( uSet ) --> Previous setting
Possible values of the param are nil or .f. or .t.
a)If the parameter is NIL or the function is never called.
This is the default behavior.
DBFAPPEND() function first tries to recycled records if and only if it
has atlest one index tag with for condition "FOR DELETED()"
eg: INDEX ON RECNO() TAG RECYCLE FOR DELETED()
This index is used to quickly pick up a deleted record that can be
locked and recycles it by RECALLing and blanking all fields.
If no such record is found, a new record is appended using DBAPPEND().
If such an index tag is not available, no attempt is made to recycle
deleted records and acts like a normal DBAPPEND()
b)If the parameter is set to .F., recycling is not attempted at all even
if a "FOR DELETED()" tag exists.
c)If the parameter is set to .T., recycling is compulsorily attempted.
For pursposes of optimization,
( i) if a "FOR DELTED()" index exists, that index is used.
( ii) If an index tag with expression "DELTED()" exists, that index is used.
eg: CREATE INDEX ON DELETED() TAG DELETED
(iii) If both the indexes are not availalbe, a new index tag is created
"INDEX ON RECNO() TAG RECYCLE FOR DELETED()". If the dbf is opened
exclusively, this tag is added to the compound index and if opened
in shared mode, this tag is created temporarily in memory.
- TDatabase class adopts the same behavior while appending new records.
- TDataRow also adopts the same behaviour. So when a new record is edited
and saved, deleted records are recycled observing the above rules.
(Note this applies to oBrw:EditSource() method)
* Multiple monitor support functions:
- New function FW_GetAllMonitors() --> Array of TMonitor objects
- Fixes and enhancement to FW_GetMonitor( nthMonitor )
* Fix: RichEdit 64 bits method InsertBitmap() is ok now. It was GPFing.