3
------------------------
6
- Pascal Ganaye - upto V5.002
7
- Micha Nelissen - from there
9
thanks to various people helping on details
11
------------------------
17
- use FIXED LENGTH index expressions: an expression which will always return
18
a string which is the same length. When returning a float you don't have to
19
worry about this of course (always fixed #bytes). String fields also return
20
fixed length expression, complete field with spaces.
22
- restructure probably does not work correctly, because the field defs
23
don't know the index of the field they have to copy from (Dbf_Fields)
24
- BCB3/D3 compatibility:
25
- you will NOT be able to use Int64 features:
26
- large numeric fields with zero precision (set UseFloatFields to true)
29
- maybe more...look in source where Int64 is used
30
- no codepage conversion available other than oem<->ansi
31
- storedefs is not updated automatically when fielddefs are changed
35
------------------------
38
- fixed: restructure numeric fields correctly, try to preserve data
39
- fixed: read and write foxpro currency fieldtype (thx karelrys)
40
- fixed: when using TDbf.Insert to add a record, current record indicator does
41
not move to newly added record (rep by rpoverdijk)
42
- fixed: req. of numeric field size >= 2, it can be 1 too! (rep by rpoverdijk)
43
- fixed: forgot cursor position when disabling filter (rep by bobmitch/luchop)
44
- fixed: initialize binary field types '0' (nullflags) and 'Y' (currency)
45
properly (thx to karelrys)
46
- added: _nullflags field operation support (thx karelrys)
47
- fixed: when editing a record, then moving to another record, memo is not
48
properly cleared if memo is null (rep by versus)
49
- fixed: writing to a memo that also has a connected dbcontrol does not work;
50
quite some semantical changes, may have introduced new bugs (rep by mafro)
53
------------------------
56
- fixed: dBase III and IV do not have date+time fields
57
- fixed: index search bug, not finding records (rep by peruginia)
58
- fixed: expression bracket pair checking; caused strange expression errors
59
- fixed: parse filter expression upon opening file (rep by mvc)
60
- added: do not resync/reparse filter if not property unchanged
61
- fixed: use international string functions in expressions
62
- fixed: index deletion and update corruption while range active (rep by ralf)
65
------------------------
68
- fixed: recursive loop in index first/last
69
- fixed: index resync current record
70
- fixed: resync range at eof
71
- fixed: index findkey finds last, deleted key in index page
72
- fixed: opening dbf file with numeric integer field misreads numbers
73
- fixed: storage of foxpro binary integer field
74
- fixed: only support 65535 length character fields for foxpro
75
(otherwise ms excel generated files can not be read)
76
- fixed: call CursorPosChanged whenever cursor position possibly changed
77
- fixed: keep cursor position when index and range active as much as possible
80
------------------------
83
- fixed: outdated buffer in checking found key
84
- fixed: createtable with memorystream; tdbf.userstream (thx andrew)
85
- fixed: garbage record when adding a record to empty table
86
- fixed: fields settings size for integer fields
87
- fixed: underflow buffer in GetStrFromInt when Width=0
88
- fixed: IndexFile.PrepareKey numeric index: encode value zero to have no digits
89
- added: TDbf.PrepareKey for conversion of key to numeric index key format
90
- fixed: set physicalrecno to non-existing recno corrupts table (rep by luchop)
91
- fixed: tryexclusive/packtable/endexclusive fail because of memo (rep by sysklop)
92
- fixed: crash when calling {un,}locktable on closed dataset (rep by sysklop)
93
- fixed: use correct dbf version when creating table to decide field types
94
- fixed: kylix compilation
95
- added: multi-user and insert aware ranges (req by ralf)
96
- chngd: made all filenames lowercase to ease usage on *nix
97
- added: partial matching in expressions for filters
98
- added: -, *, / operators in expressions
99
- fixed: datetime issues with fieldtype '@' and delphi 4 and lower (nobody uses
100
those fieldtypes? they have been horribly broken, and maybe still are)
101
- fixed: getting recno in oncalcfields event (rep by lutz)
102
- fixed: AV when checking empty binary fields
103
- fixed: better foxpro header writing, fieldoffset, tabletype and headersize
105
- fixed: recursive loop in setrange
108
------------------------
111
- fixed: numeric index data exponent (rep by rpoverdijk)
112
- fixed: big-endian issues in dbf_idxfile
113
- added: spanish (thx mauricio) and brazilian portuguese translation (thx adilson)
114
- fixed: opening memory streams; more generic implementation
115
- fixed: querying ExactRecordCount on open table causes AV (rep by sikorsky)
116
- added: smarter Dbf_Parser initialization (thx emled)
117
- fixed: copy languageid and autoinc values upon restructure/pack
118
- added: TDbf.LanguageID to set language id of new table; set before CreateTable
119
- fixed: remember autoinc value after restructure
120
- fixed: do not try to create foxpro currency fields if creating dbase table
121
- speed: when reading v4 memo field, set size of stream in advance
122
- fixed: empty field really returns empty string in parser
123
- fixed: rewritten token parser, tree construction to be much simpler
124
- speed: reduce number of getrecordcount calls, cache recordcount if possible
127
------------------------
130
- fixed: crash when optimizing expression with constants
131
- fixed: expression parser to use variable-length string variables for non-raw
133
- added: support for opening (memory) streams as file
134
- fixed: numeric mdx compatibility bug; bytes instead of decimals (rep by rpoverdijk)
135
- fixed: integer fields store numerics padded with zeroes; now it uses spaces
136
- added: use new, faster assembler SwapInt64 from arioch
139
------------------------
142
- fixed: crash when finalizing Dbf_Parser unit
145
------------------------
148
- fixed: improved exception handling in expression parser
149
- fixed: remove temporary indexdefs at close, fixes CreateTable index creation
150
- added: NULLFLAGS field recognition (foxpro field)
151
- fixed: date field retrieval parser (rep by luchop)
152
- fixed: BCB5 installation needs Pascal switch to link dsgnintf unit
153
- fixed: avoid dependency on libc unit for freepascal target
154
- fixed: index open after packtable forgot tempmode; so endexclusive did not
155
work properly (rep by sysklop)
156
- chang: make TDbf.GetCurrentBuffer public
157
- chang: rename TVarType to TExpressionType
158
- chang: remove all SmallInt constructs from parser
159
- added: export expression functions from Dbf_Parser
160
- added: FFieldName to TFieldVar, to prevent need for TFieldDef to exist to get name for deletion from expression words list
161
- added: "<>", not equal, expression functions
162
- added: reference counting for TExprWord
163
- added: shortname functionality for each function, function can be referenced by name and shortname
164
- fixed: memory leak in parser upon encountering unknown variable
165
- fixed: when adding record write new autoinc value to header, to file
168
------------------------
171
- fixed: compiles with freepascal, usable in lazarus
172
- fixed: index delete record bug (deleting not-last entry in full page)
173
- fixed: index delete record bug (deleting the only entry on a page)
174
- fixed: lazarus registration issues
175
- fixed: scan for $1A, not RecordSize (rep by avink)
178
------------------------
181
- fixed: use default codepage if file codepage not installed
182
- fixed: range check error using swapint
183
- fixed: flush index header when index flushed, ie. when creating index
184
- fixed: update TDbf.IndexDefs when index added or deleted
185
- fixed: update internal index names and files list when mdx index deleted
186
- fixed: remove max 4000 character record length requirement
187
TDbf.GetExactRecordCount (rep by dpproj)
188
- fixed: accept russian 'C' too as string field (rep by dpproj)
189
- fixed: datetime native fieldtype 'T' handling, size (rep by kjteng)
190
- added: support for currency field type, type 'Y' in foxpro tables
191
- nativeformat handling is re-enabled due to much easier implementation
192
- delphi 4 and higher only
193
- fixed: close,open files reset indexnames,files list (rep by paez)
194
- fixed: reselect index after repage, compact (rep by paez)
195
- added: support for foxpro datetime fields
196
- fixed: support for foxpro integer fields
197
- fixed: tdbf doesn't use default codepage when opening file with langid #0
198
- added: OnLanguageWarning can now specify to use default codepage (see above)
199
- fixed: MDX float index with decimals (rep by emled)
200
- fixed: removal of mdx flag in foxpro file; means cdx index
203
------------------------
206
- added: freepascal support, needs 1.9 (or higher)
207
- fixed: strange bugs due to fparser not initialized correctly, for example
208
with expression of different index (rep by sysklop)
209
- added: findrecord implemented -> find{first,next,prior,last} should now work
210
- fixed: index deletion bug corner case, no records left (rep by sysklop)
211
- fixed: repagefile creating empty index file (rep by paez)
214
------------------------
217
- fixed: tdbf.physicalrecno not in sync with tdataset
218
- added: loPartialKey functionality on index search
219
- fixed: mdx file presence not written to dbf header; index does not work (rep by paez)
220
- fixed: searchkey on deleted row returns true (rep by sysklop)
221
- fixed: primary index creation throws "list index out of bounds(0)" (rep by sysklop)
224
------------------------
227
- fixed: checkkeyviolation bug; should solve locking problem
228
- fixed: packed structures
229
- fixed: delphi 3 compatibility tdbf.translate, compile prob (rep by ferdok)
230
- fixed: numeric MDX compare, translate bugs (rep by rpoverdijk)
231
- fixed: GetIndexNames returns open (available) indexes
232
- added: TDbf.GetAllIndexFiles returns index files present in dbf directory
233
- added: TDbf.PhysicalRecordCount returns physical number of records present
234
- added: TDbf.IndexDefs ( = TDbf.Indexes) for VCL compatibility
235
- added: TDbfIndexDef.(Name and Expression) for VCL compatibility where
236
Name = IndexFile and Expression = SortField
237
- fixed: memory leak expression tree
238
- fixed: index cache flush problem causing index corruption; triggered by,
239
for example, regenerateindexes (rep by smokexjc)
242
------------------------
245
- fixed: character fields support upto 65534 characters now
246
- fixed: detect, allow visual foxpro file
247
- chngd: getfielddata clears user field buffer is string field empty
248
- fixed: tdbf version number in delphi 7 package
249
- fixed: index update on record insert (thx kirill)
250
- fixed: selecting index when cursor is bof,eof; cursor moves (thx kirill)
251
- fixed: create first index in mdx file fails AV, file not deleted (rep by pyostrike)
254
------------------------
257
- added: TDbf.GetKeySize, if index is active retrieves key size
258
- added: TDbf.ExtractKey, extracts key for current record and index
259
- fixed: TDbf.GetRecordCount AV when no dbf file open
260
- fixed: memory leak not releasing fmdxfile
261
- fixed: index using field datetime has time encode error (rep by paez)
262
- fixed: end-of-memo not found, packtable creates large files (rep by stayathome)
263
- fixed: distinct index, keys added while duplicate error (rep by sysklop)
264
- fixed: when packing a table, no files are left behind
265
- fixed: AV when packing while index active (rep by ltolean)
268
------------------------
271
- fixed: fcanedit is false causing indexes not to update (rep dvdneg)
272
- fixed: autoinc when packing/restructuring table (rep aerceg)
273
- fixed: allow creation of tablelevel 25 tables (rep cherednichenko)
274
- fixed: delete last entry from index page caused overflowerror (rep by tekkan)
277
------------------------
280
- fixed: foxpro memo data size is w/o record header size
281
- fixed: index search on extended ASCII values
282
- added: filter options; caseinsensitive works; partialmatch does not
283
filter expressions never have partial matching
284
- fixed: filter field strings compare with extended ASCII values
285
- added: TDbf.GetFileNames, retrieves file names in use with current dbf
286
- fixed: open exclusive, close, open exclusive triggers 'can not open'
287
happens ie. when calling PackTable (rep by tekkan)
288
- added: getfilenamesstring function to retrieve filenames in a string
289
- fixed: Blank memo returns data (thx aerceg)
290
- fixed: no inherited call on indexdef assign (thx kirill)
291
- fixed: international issue with locate (thx kirill)
294
------------------------
297
- fixed: setting memo contents overwrites only first x bytes, not all (rep by avink)
298
- fixed: possible corruption in writememo, wrong offset (thx aerceg)
299
- fixed: indexname truncated causing inability to select index v7 (thx delphiguru)
300
- fixed: (includetrailingpathdelimiter) delphi 4 compatibility (thx bobmitch)
301
- fixed: (dbffile.openindex) open NDX file fails due to empty field (thx wschenk)
302
- fixed: codepage problems with dbase3 (thx arioch)
303
- fixed: result of boolean fields is string type (rep by delphiguru)
304
- fixed: blobstreams delphi 3 compatibility
305
- fixed: remove automatically detected indexdefs of previous file at design time
306
- fixed: index MDX numeric search (rep by arioch)
307
- fixed: index navigation when having a lot of records with the same key
309
- fixed: try harder to find a matching locale / codepage combination; any
310
codepage will do if no specific codepage is found
313
------------------------
316
- added: new assembler implementation for swapint, swapint64 (thx arioch)
317
- NOTE: 486+ if you need old, remove USE_ASSEMBLER_486_UP define
318
- fixed: datetime handling in index, eg. DTOS(DATE_FIELD)
319
- added: FilePathFull, this is path where the dbf is going to be opened (arioch)
320
- is not stored, only relative path is stored
321
- when set, overwrites relative path too, and relative path sets full path
322
- fixed: possible AV when executing (get|set)fielddata with nil buffer
323
- fixed: reading dbase 7 index tags, new structure, long index names supported
324
- fixed: bug storedefs = true after .open; indirect fielddefs.update
325
- fixed: index version bug causing AV; caused by new DB7 support (rep by arioch)
326
- fixed: SearchKey in Edit without Post -> record twice (thx ralf)
327
- fixed: TDataSet.(InsertRecord | AppendRecord) now really work instead of doing
328
nothing. NOTE: they do the same thing, as you cannot insert a record in DBF,
330
- fixed: index bug; insert in wrong page sometimes causing various assert fails
331
- added: a bunch of freeandnil instead of [x.Free; x := nil;]; should be safer
332
- added: more language / locale combinations; now combinations using windows
333
codepages (1250,1251,1253,...) and (russian, greek, etc) should be possible
334
- fixed: delphi 3 compatibility
335
- fixed: cancel memo bug; when memo modified, release focus, cancel record then
336
memo has already written contents to file
337
- chngd: absolute/relativepath properties use same handler (thx arioch)
338
- fixed: AV when SearchKey called with NULL variant
339
- fixed: when creating dbf, tablelevel = 25 indicates foxpro
340
NOTE: dbfglobals.defaultcreatefoxpro removed
341
- added: SetIndexName throws exception when try to select non-existing index
342
- fixed: index needs to convert strings OEM->ANSI before comparing; I think
343
the sorting works very nicely now, eg.: e, E, e-accent-grave, etc all same
344
NOTE: you need to rebuild all indexes because of this change
345
- fixed: when creating dbf: also foxpro langids will be used and the
346
other way around...increases number of combinations
347
- fixed: index bugs; first record insert in distinct index, EOF insert caused
348
AV on closing app (report thx germain)
349
- fixed: memo bug; memo files with large pages (>512) had incorrect calculation
350
of position, reading false data (rep by kjteng)
353
------------------------
356
- added: IndexFieldNames property to set current index by fieldname
357
- added: foxpro memo files (.fpt) support
358
- fixed: indexing bug, when inserting same key at end
359
- fixed: more indexing bugs...
360
- NOTE: non-leaf keys assume searchkey < nodekey
361
- this is default B+ tree
362
- previously tdbf assumed searchkey <= nodekey
363
- you may have to recreate indexes
364
- chngd: FinishCreate does not need memo extension anymore
365
- chngd: PackTable uses different filename now abc_1.dbf etc
366
- chngd: Dbf_PgFile.pas: renamed LockFile to LockAllPages;
367
-> Kylix users should be able to compile with LockFile from Dbf_Wtil.pas
368
- chngd: default locale now retrieved from GetUserDefaultLCID
369
- fixed: when closing/opening dbf file, reopens indexes too (thx oleg)
370
-> fixed an AV when packtable is done and you try access an index
371
- fixed: (caused by above index bug) does not find last record in index
372
-> caused dbgrid to display records twice or not at all
373
- fixed: packindex now properly selects single index, so that it can be edited
374
-> previously no expression was parsed creating empty indexes (thx oleg)
375
- fixed: insert/modify/delete/find records while index range active (thx paul)
376
-> findnearest function rewritten
377
- fixed: foxpro table level less than dBase7 table level, now reads fields
378
correctly in dBaseIII alike format
379
- fixed: when reading memo, negative blockno return empty memo instead of crash
380
- fixed: using AnsiUppercase instead of Uppercase, better internalization
381
- fixed: ignore addindex calls with empty index names / fields
382
- fixed: Get/SetFieldData NativeFormat issue with DB7:datetime fields (thx tophet)
383
- fixed: tdbfindexdef; name and field now stored uppercase to prevent
384
differences in case (thx arioch)
385
- chngd: tablename property editor starts in project directory not delphi/bin
386
directory when no filepath given; if you want filepath to be current path
387
at startup of app: use '.' or '.\' as filepath (current dir)
388
- chngd: dbf_globals.defaultopencode changed to getacp, seems to be more
389
compatible, especially when your codepage is not supported by dbase
390
- fixed: fix for empty path in IncludeTrailingPathDelim
393
------------------------
396
- added: BeforeAutoCreate event: set DoCreate to false to prevent autocreate
397
- added: polish + french message strings up to date, thx tophet+lecho
398
- added: fielddefs, storedefs published property alike ttable
399
WARNING: ALPHA feature, not tested well
400
- added: error handling for dbf creation, fields now checked before creating dbf
401
- added: fieldtypestr in error invalid_field_type, better error string
402
- fixed: preparing numeric index search, Move function had parameters wrong
404
- fixed: error message invalid field type had invalid format type
405
- fixed: index out of bounds checking better (SetEntryNo, RecurPrev)
406
- fixed: lost designtime MDX indexes when opening
407
- fixed: numeric indexes changes to database were not detected well causing
408
index corruption (thx ralf)
411
------------------------
414
- added: table level locking (TDbf.LockTable / TDbf.UnlockTable)
415
NOTE: if you're still editing a record, then LockTable will fail. Post or
416
cancel changes before trying to lock table.
417
- added: filter expressions (thx paul)
418
- WARNING: feature is currently in ALPHA state !
419
- TDbf.Filter := 'your dbase expression';
420
- index functions available for filter too
421
- added: expressions operators implemented: '=,<,>,<=,>=,and,or,not'
422
- you can use these for filter (but for index too)
423
- added: more types for operator '+'
424
- added: GetIndexNames, retrieves indexes from MDX or NDX's in dbf directory
425
- added: TDbf.RegenerateIndexes, recreates all indexes active for table
426
- added: index expression length checking in parser
427
new error message: STRING_INDEX_EXPRESSION_TOO_LONG
428
- added: polish error messages in Dbf_Str_PL.pas
429
- fixed: pass index options from object inspector to createindex (thx germain)
430
- fixed: now when closing dbf file, at runtime MDX indexes are removed from
431
indexes list, but not at design time, to keep indexes from disappearing from
432
list. You should always add/remove NDX indexes yourself! (because the dbf
433
file does not know about them).
434
- fixed: bug '0.0 is not valid timestamp' is fixed (thx felipe)
435
- I now understand VCL TDataSet..NativeFormat better -> TDbf retrieves in
436
native format, then VCL translates to destination format
437
- it'll be a little slower, but more compatible
438
- get/setfielddata override in TDbf removed
442
------------------------
445
- fixed: it now compiles (shame on me)
446
- note: experimental new index insert order to check first before
447
inserting record into database
450
------------------------
453
- chnge: same functionality, clearer implementation of autocreate in
455
- fixed: automagic creation of MDX indexes in TDbf.Indexes property if not exist
456
- added: on creation of MDX indexes now automagically tries exclusive mode
457
itself, if fails, then same as old behaviour (exception)
458
- fixed: order autoinc assignment to new record and updating index, previously
459
empty index. Now first autoinc is assigned, then indexes updated.
460
- fixed: auto-detect non-present index in MDX file and create it
461
- fixed: crash on master/detail range when no index or no field selected
462
- fixed: try exclusive when creating, reopened creating causing filesize = 0
463
now it reopens non-create, ie normally
464
- added: checking whether field type okay for specified table level;
465
new error string: 'STRING_INVALID_FIELD_TYPE'
466
- fixed: searchkey (using variants) on numeric MDX index; code inserted to
470
------------------------
473
- fixed: delphi 3 compatibility issues
474
- fixed: bug in check exclusive access (thx martin)
475
- fixed: correct dbf version when creating dbf from fielddefs (thx martin)
476
- fixed: correct dbf version when creating memo file along with dbf ( " )
477
- added: set method for physicalrecno
478
- fixed: when using masterlink on non-string field, proper field conversion
479
- fixed: master/detail bug, empty range at start of file
482
------------------------
485
- fixed: bug when opening dbf file with index in indexes property that does
486
not yet exist. Now it will create index.
487
- fixed: delphi 4 compatibility (thx dayman)
488
- fixed: readonly mode now also shared access, bug not showing new records
489
- fixed: bug when reading past EOF in memo results in crash or garbage
490
- fixed: bug when index somewhat corrupt ( = record duplicate in index),
491
- bug caused repeats of the same record
492
- now skips records which are the same; based on recno
493
- fixed: bug in IDE, when table open, clicking on IndexName caused table to
494
close, (internal exception was generated)
497
------------------------
500
- added: project file for BCB6 (tdbf_c6*)
501
- added: polish mazovia support (db4 id $69, codepage 620, locale LANG_POLISH,
502
dbase7 id: 'DB620PO1')
503
- added: Locate uses index search if simple index
504
- fixed: bug 'divide by zero', in 1024b memo (thx ltolean)
505
- fixed: bug in decimal separator, read & not write field (thx michaelbelling)
506
- fixed: bug in indexing: extracting string field values from database
507
- NOTE: index function UPPERCASE/LOWERCASE introduced, but you should use
508
UPPER/LOWER for dbase compatibility
509
- fixed: dbase 7 files, if no extra properties present, don't read them
510
- added: buffering & caching
511
- disabled by default, see Dbf_Common.Inc 'USE_CACHE'
512
- you will need to add 'dbf_avl.pas' and 'dbf_pgcfile.pas' to tdbf project
513
to be able to use them (already done in tdbf_c5r.bpk)
514
- buffering: read & write ahead for files
515
- caching: of index pages in memory
516
- can improve indexing speed over network connections A LOT, especially
517
if you have some memory to spare, to save the new index in
520
------------------------
523
- fixed: bug in pagefile, writerecord not increasing recordcount well (arghh)
524
- fixed: bug in SetRange (empty range) (thx jenswahl)
525
- fixed: bug when appending records, header record count not updated (thx ron)
526
- fixed: bug when translating empty memo, AV (thx vern baker)
527
- fixed: bug when indexing empty table, unusable index (thx nogueira)
528
- fixed: bugs in RegenerateIndexes, index header 'lost'
529
- chang: handling of making valid key in SearchKey -> could solve bug stefano?
530
- now use StringOfChar, instead of manual fill with spaces
531
- added: zap, emptytable (you can guess what it does ;-))
532
- added: dutch error messages (Dbf_Str_NL.pas)
535
------------------------
538
- fixed: bug in TryExclusive
539
- fixed: bug in SearchKey, wrong array index causing searches to fail
540
- fixed: bug in TPageFile, chopping file size on multipage record (MDX indexes)
541
- fixed: bug in RepageFile, crashes when deleting/reindexing MDX index
542
- chang: speed optimisation in TPagedFile.WriteRecord, calc new record count
543
- fixed: specifying indexname for MDX longer than 10 characters, now truncates
546
------------------------
549
- added: french strings in Dbf_Str_FR.pas
550
- added: index functions uppercase and lowercase
551
- fixed: index bug using dbase III files
552
- fixed: re-indexing existing (NDX) file fails
553
- fixed: index bug (NDX) concerning expression index
554
- chnge: TPagedFile.GetRecordCount now only retrieves file size if not in
555
multi-user share mode, to speed up things a little bit
556
- fixed: index bug splitting pages
557
- fixed: page file set record count, now using pageoffset next page
558
- fixed: reading of type III memos
559
- added: translation of memo text fields (transliterate = true). Handling of
560
translation should now be consistent between memo fields and char fields.
563
------------------------
566
- fixed: ftDateTime handling field size
567
- fixed: writing memo version byte
568
- added: VCL ftFixedChar will be converted to 'C' (character) field
569
- added: property DateTimeHandling (dtDateTime, dtBDETimeStamp)
571
Up to now TDbf used to store values in '@' (ftDateTime) fields as Delphi
572
type TDateTime. To be compatible with the BDE, however, datetimes need to be
573
stored as BDE type TimeStamp (which is milliseconds elapsed since 01/01/0001
574
plus one day). To provide backward compatibility you can use this property
575
to determine whether TDbf will read and write datetime values as TDateTime
576
or as BDE TimeStamp. Default now is dtBDETimeStamp but in order to read
577
values in existing TDbf tables you need to choose dtDateTime. If you want to
578
convert your data to be BDE compatible have a look at the new procedure
581
- added: procedure CopyFrom(DataSet: TDataSet; FileName: string;
582
DateTimeAsString: boolean; Level: Integer);
584
Use this procedure to copy the contents of a given DataSet into a new TDbf
585
table. DataSet is the TDataSet you want to copy from, FileName is the
586
complete (including path and extension) filename of the new table.
587
DateTimeAsString determines whether datetime fields should be converted to
588
string fields in the target table. This is especially useful if you want to
589
use TDbf to create mailing sources for a text processor for example. If this
590
parameter is set True an event OnCopyDateTimeAsString is triggered where you
591
can override the default datetime-to-string conversion which is based on
592
your current local settings. Level determines the TableLevel of the target
595
In order to convert existing datetime values into a BDE compatible format
596
use this procedure as follows: drop two instances of TDbf on a form, set
597
DateTimeHandling of TDbf1 to dtDateTime and connect it with the existing
598
table. Make sure TDbf2 is set to dtBDETimeStamp and call CopyFrom with
599
DataSet = TDbf1 and DateTimeAsString = False. You can then replace the old
600
table with the new one and use TDbf in dtBDETimeStamp mode in your
604
------------------------
607
- added: TryExclusive method to 'try go exclusive' eg.:
610
if Dbf1.Exclusive then
615
ShowMessage('somebody else is using file');
618
- fixed bug: adding records while string index active don't show up
619
- fixed bug: clear field when backspace hit
620
- fixed bug: not saving memo byte in version data correctly
621
- fixed bug: sometimes crash when opening empty database
622
- fixed bug: DB desktop writes index type 'F' instead of 'N'
623
- fixed bug: writing negative integer values to fields
624
- fixed bug: assertion failure when adding a lot of the same data in index
625
- changed: default open mode is now normal instead of autocreate
628
------------------------
631
- added integer and smallint support to STR() in expression indexes
632
- fixed bug: creating dbf files, index field not found, due to uppercase names
633
- fixed bug: float conversion in STR() more alike dbase
634
- fixed bug: parser crashes while removing constants in optional parameters
637
------------------------
640
- added Variant support to SearchKey & SetRange
641
- fixed bug: NDX index split
642
- fixed bug: DeleteIndex could not find index
643
- fixed bug: MDX with dBaseIII locale problem
644
- fixed bug: descending sort index
645
- demo app v1.3 will compile with this package
646
- much thanks to Paul v.H. for help on this release
649
------------------------
652
- added Int64 support for index expressions
653
- updates to support for Kylix (dbf_wtil.pas)
654
- fixed bug: Parser.GetResultType for single field indexes
655
- fixed bug: IndexFile.ExtractKeyFromBuffer integer -> numeric conversion
656
- fixed bug: creating NDX index crashes
657
- fixed bug: creating NDX index wrong locale
658
- fixed bug: while filtering wrong memo contents retrieved
661
------------------------
664
- added: beta support for Kylix (2)
665
- fixed: last field missing (reported by wimb and many others)
666
- fixed: Delphi 3 compatibility problem in Dbf_Fields.pas
667
- fixed: calculated fields bug (sometimes not show data)
670
------------------------
673
- added: beta support for numeric indexes in MDX
674
- changes Delphi 3 compatible (as reported by crest)
675
- change Delphi 4 compatible: .Items[I].Free instead of .Delete(I)
676
- fixed store that an index is an expression index -> indexes read from
677
file are 'always' tagged as expression index...will keep you updated
678
- change TDbf_D6*.dpk -> they work now...dbf.dcr problem resolved
679
- fixed bug: detect end of header, invalid dbf
682
------------------------
685
- added IndexName property list...listing MDX / NDX indexes
686
- added distinct index support
687
- use ixPrimary in IndexOptions to create
688
- checks key violations
689
- removed RES file requirement from CB packages
690
- fixed NDX index bug: opening index fails (out of bounds) (report by thx)
691
- fixed MDX open dBase VII index bug...language id mismatch
692
- fixed MDX multiple index bug: key was calculated before selection
693
instead of after, oops :-(
696
------------------------
699
- added support for creating tables in different locales/codepages
700
- default is ANSI / Western European (= ENGLISH_UK currently)
701
- eg. to create table in US locale
702
DbfGlobals.CodePage := 437;
703
DbfGlobals.Locale := LANG_ENGLISH or (SUBLANG_ENGLISH_US shl 10);
704
- changed structure: Mdx & Ndx implemented as descendants of TIndexPage
705
- new (public) DisableResyncOnPost property, if enabled, will suppress resync
706
after post -> will increase speed. Use it if you are editing all records.
707
- removed global variable FDbfExePath
708
- fixed memory leak: expression record
709
- fixed setfielddata.string bug (reported by atilla)
712
------------------------
715
- added duplicate field name handling
716
- fixed index close bug
717
- added TDbfIndexDef.Assign
718
- added TDbf.TableLevel property, indicates table level like TTable
719
- added support for creating dBase7 databases
720
- set TTable.TableLevel to 7 before calling CreateTable
721
- added fieldlist copy feature VCL->DBF
723
FieldDefs: TFieldDefs;
724
DbfFieldDefs: TDbfFieldDefs;
726
DbfFieldDefs.Assign(FieldDefs);
727
- float/integer fields will get a default size / precision
728
- CopyFrom will get index of field that is assigned
729
- added restructure procedure
730
- probably still buggy -> TEST WELL before using
731
- table needs to be closed before calling restructuretable
732
- create TDbfFieldDefs list
733
- TDbfFieldDef.CopyFrom
734
- is index of current table field to copy
735
- CopyFrom = -1 means add
737
NewFieldDefs: TDbfFieldDefs;
738
NewFieldDef: TDbfFieldDef;
741
// create new field list
742
NewFieldDefs := TDbfFieldDefs.Create(Self);
743
// assign current list
744
NewFieldDefs.Assign(Dbf1.DbfFieldDefs);
745
// assume first field is string, 20 wide, make larger to 40
746
NewFieldDefs.Items[0].Size := 40;
747
// rename second field to 'RENAMED'
748
NewFieldDefs.Items[1].FieldName := 'RENAMED';
750
NewFieldDef := NewFieldDefs.AddFieldDef;
751
NewFieldDef.FieldName := 'NEW_FLOAT';
752
NewFieldDef.FieldType := ftFloat;
753
NewFieldDef.Size := 10;
754
NewFieldDef.Precision := 3;
755
// restructure table and pack
756
Dbf1.Restructure(NewFieldDefs, true);
757
// restructure table and not pack
758
//Dbf1.Restructure(NewFieldDefs, false);
763
------------------------
766
- Master / detail supported!
767
- NOTE: TDbf can only have another TDbf as master!
768
- MasterFields is an expression
769
- TableName / FilePath handling changed...bug fixed
770
if FilePath is non-empty then a file assigned to TableName without path
771
will not clear FilePath -> bug fixed reading from DFM
772
- expression with variables: 'function/operand has too many arguments' fixed
774
- index repaging fixed
775
- index cursor move next fixed (possible problem at EOF)
778
------------------------
781
- SetTableName simplified, extract full path
784
- Grouping of files in TDbfDatabase removed
785
-> each TDbf has it's own TDbfFile, no sharing -> some bugs fixed
786
- Renamed global DbfDefaultDatabase to DbfGlobals
787
- Renamed files to Dbf_* to distinguish a little from others, note:
788
- FieldDef -> Dbf_Fields
790
- Parse* -> Dbf_Prs*; except Parser -> Dbf_Parser
791
- AutoInc field bugs fixed:
792
- generate value at post
793
- multi-user share aware
794
- IncludeTrailingBackslash added for D4 and earlier
797
------------------------
800
- field types: size=1..4, prec=0 is always smallint
803
------------------------
806
- MAJOR COOL: field default values are supported!
807
- you can't create table with default values yet, (dBase 7 only)
808
- if table is made with DB2K, dBase 7, default values are read from header
809
- exclusive access is required for PackTable to avoid corruption
810
- automatically add last backslash in FilePath, now really works
811
- sorry, 5.7.7 didn't compile
812
- renamed MSWINDOWS defs to WIN32, which is more standard
813
- DBF locking is now BDE compatible, not sure about index & memo
814
- Added TDbf.UseFloatFields, when dbffieldtype = 'N', then UseFloatFields
815
will force ftFloat fields, otherwise when precision is zero an integer field
816
will be used, NOTE: UseFloatFields is default true
817
- structure change: passing data via constructor to assigning through
821
------------------------
824
- Italian message strings in Strings_ITA.pas (thanks delphiguru)
826
- automatically add last backslash in FilePath
827
- deleted records are now checked with (= '*') instead of (<> ' ')
828
-> slightly different runtime behaviour if another character is present
831
------------------------
834
- _DBASELOCK field can now be in any position
836
- ShowDeleted bug fixed
837
- Delete method bug fixed
838
- Inserting a record will return physical recno: -1
841
------------------------
844
- _DBASELOCK field is hidden from normal view
845
- changes from Paul van Helden applied:
846
- assigning Filtered property
847
- default size/precision float field
848
- Int64 support enabled for Delphi 4
849
- AutoInc fields enabled for Delphi 4
852
------------------------
855
- Delphi 4 date field bug, worked on, untested, I hope it works now
856
- Delphi 7: dbf_reg needs ExptIntf as unit
857
- constructing field list bug fixed...more dbase 7 compatible
858
now reads until field termination character found
859
- various memory leaks fixed
860
- when last field is named _DBASELOCK it will update it when start edit:
861
- first 2 bytes: change count is incremented
862
- next 3 bytes: current time hour,minute,second
863
- next 3 bytes: current date year,month,day
864
- next 0..16 bytes: name of user who locked the record
867
------------------------
870
- unique indexes supported
871
- descending indexes supported
873
- clearing expression
874
- resulting length from simple field
877
------------------------
880
- striving for delphi 4 and older compatibility.... (thanks don)
881
- TDbf.GetFieldData/SetFieldData seems D5 only
884
------------------------
887
- parser core bugs fixed:
890
- float fields bug fixed: storing data
892
- auto detecting float result from expression
893
- updating index when record edited
894
- parser will now only accept a dot as decimal separator whatever your
895
DecimalSeparator character is. A comma will always be the argument separator.
898
------------------------
903
- all named tdbf_..., see package.txt
904
- I hope they all work...I haven't been able to test them
905
- GetFieldData method: boolean field type widened to Word length
906
- Index Expression Support !!!
907
- used FWS expression parser from torry.net
908
- still adding functions but basic STR() and DTOS() and '+' are implemented
909
- Languages replaced by own LCID list so that it can compile under D4/C4 and older
912
------------------------
915
- fixed indexing bugs
917
- opening ndx files corrupted them
919
- some help on new events:
920
- OnLanguageWarning: when a specified codepage in dbf file is not present
921
on computer, then this event is fired, you can force a different codepage
923
- OnLocaleError: when locale used in index is not present on computer this
924
event is fired. When using wrong locale, you can mess up the index!!!
925
Again, you can force to use the index, default is to close.
926
- OnIndexMissing: when dbf file has flag that there is a MDX index attached
927
to this dbf file, then when this MDX file is not present, this event is fired.
928
You need to override it if you want to copy another MDX index to this database,
929
default is to break link to MDX file.
932
------------------------
935
- fixed 'CloseDbf' bug (thanks Paul, Eugeny) when opening / closing tables many times
936
- Delphi 3 supported again (removed Int64 reference & recoding) (test compile D3, anyone?)
939
------------------------
942
- fixed CreateTable bug (thanks Eugeny)
943
- there seemed heavy need for this fix :-)
944
- fixed Memo bug (thanks Christian)
947
------------------------
950
- fixed stupid Undelete bug (thanks Gvido)
951
- fixed NDX index list bugs
952
- fixed indexing bugs
953
- included dbflang.inc in package
956
------------------------
959
- language support...continued (locale support added). index sorting is now
960
done using locale-dependent CompareString from Windows. However, it seems
961
to be always case insensitive.
962
- FIndexes bug fixed, indexfile always created as NDX index, now it is created
963
based only as NDX if .NDX added, otherwise in MDX file. (thanks thiaux for pointing it out)
964
- new FOnIndexMissing event, when an MDX index is missing, it will notify you asking to delete
965
the link or close file
966
- new ExactRecordCount property, it will give #records you are viewing:
967
RecordCount - #deleted records - #records not in filter
968
warning: this will visit the whole dataset each time you request the property,
969
so it will be very slow on larger tables
972
------------------------
975
- language support (codepages)
976
- NOTE: this is Win32 compatible only, whole project is now Win32 compatible only for sure
977
can anyone translate the codepages to linux? to make it linux compatible again
978
- TTranslateEvent changed, you have to return an Integer with length of Dest, or -1 to let it be calculated automatically
981
------------------------
984
- Parser now in separate class: potential to parse more complex expressions, including multi-field indexes and such
985
- Linux compatible support...test anyone...I don't have Kylix...
986
- Bugfixes in InternalDelete and PackTable, thanks jimcampbel
989
------------------------
993
- Some indexing bugs resolved
996
------------------------
999
- TIndexPage.FindNearest uses binary search instead of linear
1002
------------------------
1005
- SearchKey method searches on index for a given key
1006
SearchKeyType: stEqual, stGreaterEqual, stGreater
1007
- MDX index support: index names with no extension now create a MDX index
1008
belonging to dbf file
1009
- SetRange method instead of BracketLow/BracketHigh, rewritten range support
1010
- Index.SetPhysicalRecNo much faster, using Find instead of searching recno
1013
------------------------
1016
- see original TDbf website?