-
Notifications
You must be signed in to change notification settings - Fork 6
Description
In DBF.Pas I had to add a byte read to have all working... :
Constructor TDBFReader.Create(const FileName: String);
begin
inherited Create;
FRecordIndex := -1;
FFileName := FileName;
FileStream := TBufferedFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite,4096);
FileReader := TBinaryReader.Create(FileStream,TEncoding.ANSI);
// Read table file header
Version := FileReader.ReadByte and 7;
if Version = 4 then raise Exception.Create('dBase level 7 files not supported');
for var Skip := 1 to 3 do FileReader.ReadByte; // Last update date
FRecordCount := FileReader.ReadInteger;
FFieldCount := (FileReader.ReadInt16 div 32)-1;
for var Skip := 1 to 2 do FileReader.ReadByte; // Nr record bytes
for var Skip := 1 to 2 do FileReader.ReadByte; // Reserved
FileReader.ReadByte; // Incomplete dBase IV transaction
FileReader.ReadByte; // dBase IV encryption flag
for var Skip := 1 to 12 do FileReader.ReadByte; // Reserved
FileReader.ReadByte; // Production MDX flag
FileReader.ReadByte; // Language driver
for var Skip := 1 to 2 do FileReader.ReadByte; // Reserved
// Read field descriptor records
SetLength(FFields,FFieldCount);
for var Field := 0 to FFieldCount-1 do
begin
Var DoMore:=True;
for var NameChar := 1 to 11 do
begin
var Chr := FileReader.ReadChar;
if Chr = #0 then
DoMore:=False
else if DoMore then
FFields[Field].FFieldName := FFields[Field].FFieldName + Chr;
end;
FFields[Field].FFieldType := FileReader.ReadChar;
for var Skip := 1 to 4 do FileReader.ReadByte; // Reserved
FFields[Field].FFieldLength := FileReader.ReadByte;
FFields[Field].FDecimalCount := FileReader.ReadByte;
for var Skip := 1 to 14 do FileReader.ReadByte;
end;
// Read header terminator
FileReader.ReadByte;
FileReader.ReadByte; //%%FP Ho dovuto aggiungerlo!
end;