|
@@ -374,7 +374,7 @@ type
|
|
|
|
|
|
function IsDeleted: Boolean;
|
|
|
procedure Undelete;
|
|
|
-
|
|
|
+ // Call this after setting up fielddefs in order to store the definitions into a table
|
|
|
procedure CreateTable;
|
|
|
procedure CreateTableEx(ADbfFieldDefs: TDbfFieldDefs);
|
|
|
procedure CopyFrom(DataSet: TDataSet; FileName: string; DateTimeAsString: Boolean; Level: Integer);
|
|
@@ -1048,18 +1048,17 @@ end;
|
|
|
|
|
|
procedure TDbf.GetFieldDefsFromDbfFieldDefs;
|
|
|
var
|
|
|
- I, N: Integer;
|
|
|
+ I: Integer;
|
|
|
TempFieldDef: TDbfFieldDef;
|
|
|
TempMdxFile: TIndexFile;
|
|
|
- BaseName, lIndexName: string;
|
|
|
-begin
|
|
|
- FieldDefs.Clear;
|
|
|
+ lIndexName: string;
|
|
|
+ lFieldDefCount: integer; //Counter for destination fielddefs
|
|
|
|
|
|
- // get all fields
|
|
|
- for I := 0 to FDbfFile.FieldDefs.Count - 1 do
|
|
|
+ procedure FixDuplicateNames;
|
|
|
+ var
|
|
|
+ BaseName: string;
|
|
|
+ N: Integer;
|
|
|
begin
|
|
|
- TempFieldDef := FDbfFile.FieldDefs.Items[I];
|
|
|
- // handle duplicate field names
|
|
|
N := 1;
|
|
|
BaseName := TempFieldDef.FieldName;
|
|
|
while FieldDefs.IndexOf(TempFieldDef.FieldName)>=0 do
|
|
@@ -1067,6 +1066,18 @@ begin
|
|
|
Inc(N);
|
|
|
TempFieldDef.FieldName:=BaseName+IntToStr(N);
|
|
|
end;
|
|
|
+ end;
|
|
|
+
|
|
|
+begin
|
|
|
+ FieldDefs.Clear;
|
|
|
+
|
|
|
+ // get all fields
|
|
|
+ lFieldDefCount:=-1; //will be fixed by first addition
|
|
|
+ for I := 0 to FDbfFile.FieldDefs.Count - 1 do
|
|
|
+ begin
|
|
|
+ TempFieldDef := FDbfFile.FieldDefs.Items[I];
|
|
|
+ // handle duplicate field names:
|
|
|
+ FixDuplicateNames;
|
|
|
// add field, passing dbase native size if relevant
|
|
|
// TDbfFieldDef.Size indicates the number of bytes in the physical dbase file
|
|
|
// TFieldDef.Size is only meant to store size indicator for variable length fields
|
|
@@ -1079,21 +1090,31 @@ begin
|
|
|
else
|
|
|
FieldDefs.Add(TempFieldDef.FieldName, TempFieldDef.FieldType, 0, false);
|
|
|
end;
|
|
|
+ lFieldDefCount:=lFieldDefCount+1;
|
|
|
|
|
|
- FieldDefs[I].Precision := TempFieldDef.Precision;
|
|
|
+ FieldDefs[lFieldDefCount].Precision := TempFieldDef.Precision;
|
|
|
|
|
|
{$ifdef SUPPORT_FIELDDEF_ATTRIBUTES}
|
|
|
// AutoInc fields are readonly
|
|
|
if TempFieldDef.FieldType = ftAutoInc then
|
|
|
- FieldDefs[I].Attributes := [Db.faReadOnly];
|
|
|
+ FieldDefs[lFieldDefCount].Attributes := [Db.faReadOnly];
|
|
|
|
|
|
// if table has dbase lock field, then hide it
|
|
|
if TempFieldDef.IsLockField then
|
|
|
- FieldDefs[I].Attributes := [Db.faHiddenCol];
|
|
|
+ FieldDefs[lFieldDefCount].Attributes := [Db.faHiddenCol];
|
|
|
|
|
|
// Hide system/hidden fields (e.g. VFP's _NULLFLAGS)
|
|
|
if TempFieldDef.IsSystemField then
|
|
|
- FieldDefs[I].Attributes := [Db.faHiddenCol];
|
|
|
+ FieldDefs[lFieldDefCount].Attributes := [Db.faHiddenCol];
|
|
|
+{$else}
|
|
|
+ // Poor man's way of hiding fields that shouldn't be shown/modified:
|
|
|
+ // Note: Visual Foxpro seems to allow adding another _NULLFLAGS field
|
|
|
+ // todo: test this with lockfield, then add this (TempFieldDef.IsLockField)
|
|
|
+ if (TempFieldDef.IsSystemField) then
|
|
|
+ begin
|
|
|
+ FieldDefs.Delete(lFieldDefCount);
|
|
|
+ lFieldDefCount:=lFieldDefCount-1;
|
|
|
+ end;
|
|
|
{$endif}
|
|
|
end;
|
|
|
|