Browse Source

* TRecordBuffer, first batch (src/base). Delphi/Unicode defines buffer types as TRecordBuffer=PByte.
For now, TRecordBuffer=Pansichar is used, but at least the signatures are more D2009+ compat now.

git-svn-id: trunk@19994 -

marco 13 years ago
parent
commit
405432c147

+ 86 - 87
packages/fcl-db/src/base/bufdataset.pas

@@ -84,7 +84,7 @@ type
      - If UpdateKind is ukModify it contains a record-buffer which contains the old data
      - If UpdateKind is ukDelete it contains a record-buffer with the data of the deleted record
 }
-    OldValuesBuffer    : pchar;
+    OldValuesBuffer    : TRecordBuffer;
   end;
 
   PBufBlobField = ^TBufBlobField;
@@ -116,10 +116,10 @@ type
   protected
     function GetBookmarkSize: integer; virtual; abstract;
     function GetCurrentBuffer: Pointer; virtual; abstract;
-    function GetCurrentRecord: PChar; virtual; abstract;
+    function GetCurrentRecord: TRecordBuffer; virtual; abstract;
     function GetIsInitialized: boolean; virtual; abstract;
-    function GetSpareBuffer: PChar; virtual; abstract;
-    function GetSpareRecord: PChar; virtual; abstract;
+    function GetSpareBuffer: TRecordBuffer; virtual; abstract;
+    function GetSpareRecord: TRecordBuffer; virtual; abstract;
   public
     DBCompareStruct : TDBCompareStruct;
     Name            : String;
@@ -151,7 +151,7 @@ type
 
     procedure InitialiseIndex; virtual; abstract;
 
-    procedure InitialiseSpareRecord(const ASpareRecord : PChar); virtual; abstract;
+    procedure InitialiseSpareRecord(const ASpareRecord : TRecordBuffer); virtual; abstract;
     procedure ReleaseSpareRecord; virtual; abstract;
 
     procedure BeginUpdate; virtual; abstract;
@@ -160,7 +160,7 @@ type
     procedure AddRecord; virtual; abstract;
     // Inserts a record before the current record, or if the record is sorted,
     // insert it to the proper position
-    procedure InsertRecordBeforeCurrentRecord(Const ARecord : PChar); virtual; abstract;
+    procedure InsertRecordBeforeCurrentRecord(Const ARecord : TRecordBuffer); virtual; abstract;
     procedure EndUpdate; virtual; abstract;
     
     procedure RemoveRecordFromIndex(const ABookmark : TBufBookmark); virtual; abstract;
@@ -169,9 +169,9 @@ type
     Function GetRecNo(const ABookmark : PBufBookmark) : integer; virtual; abstract;
 
 
-    property SpareRecord : PChar read GetSpareRecord;
-    property SpareBuffer : PChar read GetSpareBuffer;
-    property CurrentRecord : PChar read GetCurrentRecord;
+    property SpareRecord : TRecordBuffer read GetSpareRecord;
+    property SpareBuffer : TRecordBuffer read GetSpareBuffer;
+    property CurrentRecord : TRecordBuffer read GetCurrentRecord;
     property CurrentBuffer : Pointer read GetCurrentBuffer;
     property IsInitialized : boolean read GetIsInitialized;
     property BookmarkSize : integer read GetBookmarkSize;
@@ -190,10 +190,10 @@ type
   protected
     function GetBookmarkSize: integer; override;
     function GetCurrentBuffer: Pointer; override;
-    function GetCurrentRecord: PChar; override;
+    function GetCurrentRecord: TRecordBuffer; override;
     function GetIsInitialized: boolean; override;
-    function GetSpareBuffer: PChar; override;
-    function GetSpareRecord: PChar; override;
+    function GetSpareBuffer: TRecordBuffer; override;
+    function GetSpareRecord: TRecordBuffer; override;
   public
     FLastRecBuf     : PBufRecLinkItem;
     FFirstRecBuf    : PBufRecLinkItem;
@@ -219,7 +219,7 @@ type
 
     procedure InitialiseIndex; override;
 
-    procedure InitialiseSpareRecord(const ASpareRecord : PChar); override;
+    procedure InitialiseSpareRecord(const ASpareRecord : TRecordBuffer); override;
     procedure ReleaseSpareRecord; override;
 
     procedure RemoveRecordFromIndex(const ABookmark : TBufBookmark); override;
@@ -227,7 +227,7 @@ type
 
     procedure BeginUpdate; override;
     procedure AddRecord; override;
-    procedure InsertRecordBeforeCurrentRecord(Const ARecord : PChar); override;
+    procedure InsertRecordBeforeCurrentRecord(Const ARecord : TRecordBuffer); override;
     procedure EndUpdate; override;
   end;
 
@@ -235,14 +235,14 @@ type
 
   TUniDirectionalBufIndex = class(TBufIndex)
   private
-    FSPareBuffer: PChar;
+    FSPareBuffer:  TRecordBuffer;
   protected
     function GetBookmarkSize: integer; override;
     function GetCurrentBuffer: Pointer; override;
-    function GetCurrentRecord: PChar; override;
+    function GetCurrentRecord: TRecordBuffer; override;
     function GetIsInitialized: boolean; override;
-    function GetSpareBuffer: PChar; override;
-    function GetSpareRecord: PChar; override;
+    function GetSpareBuffer: TRecordBuffer; override;
+    function GetSpareRecord: TRecordBuffer; override;
   public
     function ScrollBackward : TGetResult; override;
     function ScrollForward : TGetResult; override;
@@ -264,7 +264,7 @@ type
     procedure GotoBookmark(const ABookmark : PBufBookmark); override;
 
     procedure InitialiseIndex; override;
-    procedure InitialiseSpareRecord(const ASpareRecord : PChar); override;
+    procedure InitialiseSpareRecord(const ASpareRecord : TRecordBuffer); override;
     procedure ReleaseSpareRecord; override;
 
     procedure RemoveRecordFromIndex(const ABookmark : TBufBookmark); override;
@@ -272,7 +272,7 @@ type
 
     procedure BeginUpdate; override;
     procedure AddRecord; override;
-    procedure InsertRecordBeforeCurrentRecord(Const ARecord : PChar); override;
+    procedure InsertRecordBeforeCurrentRecord(Const ARecord : TRecordBuffer); override;
     procedure EndUpdate; override;
   end;
 
@@ -289,10 +289,10 @@ type
   protected
     function GetBookmarkSize: integer; override;
     function GetCurrentBuffer: Pointer; override;
-    function GetCurrentRecord: PChar; override;
+    function GetCurrentRecord: TRecordBuffer; override;
     function GetIsInitialized: boolean; override;
-    function GetSpareBuffer: PChar; override;
-    function GetSpareRecord: PChar; override;
+    function GetSpareBuffer: TRecordBuffer; override;
+    function GetSpareRecord: TRecordBuffer; override;
   public
     FCurrentRecInd  : integer;
     FRecordArray    : array of Pointer;
@@ -320,12 +320,12 @@ type
 
     procedure InitialiseIndex; override;
 
-    procedure InitialiseSpareRecord(const ASpareRecord : PChar); override;
+    procedure InitialiseSpareRecord(const ASpareRecord : TRecordBuffer); override;
     procedure ReleaseSpareRecord; override;
 
     Function GetRecNo(const ABookmark : PBufBookmark) : integer; override;
     procedure RemoveRecordFromIndex(const ABookmark : TBufBookmark); override;
-    procedure InsertRecordBeforeCurrentRecord(Const ARecord : PChar); override;
+    procedure InsertRecordBeforeCurrentRecord(Const ARecord : TRecordBuffer); override;
 
     procedure BeginUpdate; override;
     procedure AddRecord; override;
@@ -405,7 +405,7 @@ type
     FIndexesCount   : integer;
     FCurrentIndex   : TBufIndex;
 
-    FFilterBuffer   : pchar;
+    FFilterBuffer   : TRecordBuffer;
     FBRecordCount   : integer;
 
     FPacketRecords  : integer;
@@ -430,12 +430,12 @@ type
     procedure FetchAll;
     procedure BuildIndex(var AIndex : TBufIndex);
     function GetIndexDefs : TIndexDefs;
-    function  GetCurrentBuffer: PChar;
+    function  GetCurrentBuffer: TRecordBuffer;
     procedure CalcRecordSize;
     function GetIndexFieldNames: String;
     function GetIndexName: String;
     function GetBufUniDirectional: boolean;
-    function LoadBuffer(Buffer : PChar): TGetResult;
+    function LoadBuffer(Buffer : TRecordBuffer): TGetResult;
     function GetFieldSize(FieldDef : TFieldDef) : longint;
     function GetRecordUpdateBuffer(const ABookmark : TBufBookmark; IncludePrior : boolean = false; AFindNext : boolean = false) : boolean;
     function GetRecordUpdateBufferCached(const ABookmark : TBufBookmark; IncludePrior : boolean = false) : boolean;
@@ -445,12 +445,12 @@ type
     procedure SetIndexName(AValue: String);
     procedure SetMaxIndexesCount(const AValue: Integer);
     procedure SetPacketRecords(aValue : integer);
-    function  IntAllocRecordBuffer: PChar;
+    function  IntAllocRecordBuffer: TRecordBuffer;
     procedure DoFilterRecord(out Acceptable: Boolean);
     procedure ParseFilter(const AFilter: string);
     procedure IntLoadFielddefsFromFile;
     procedure IntLoadRecordsFromFile;
-    procedure CurrentRecordToBuffer(Buffer: PChar);
+    procedure CurrentRecordToBuffer(Buffer: TRecordBuffer);
     procedure SetBufUniDirectional(const AValue: boolean);
     procedure InitDefaultIndexes;
   protected
@@ -461,12 +461,12 @@ type
     procedure SetRecNo(Value: Longint); override;
     function  GetRecNo: Longint; override;
     function GetChangeCount: integer; virtual;
-    function  AllocRecordBuffer: PChar; override;
-    procedure FreeRecordBuffer(var Buffer: PChar); override;
-    procedure ClearCalcFields(Buffer: PChar); override;
-    procedure InternalInitRecord(Buffer: PChar); override;
+    function  AllocRecordBuffer: TRecordBuffer override;
+    procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override;
+    procedure ClearCalcFields(Buffer: TRecordBuffer); override;
+    procedure InternalInitRecord(Buffer: TRecordBuffer); override;
     function  GetCanModify: Boolean; override;
-    function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
+    function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
     procedure DoBeforeClose; override;
     procedure InternalOpen; override;
     procedure InternalClose; override;
@@ -479,12 +479,12 @@ type
     procedure InternalDelete; override;
     procedure InternalFirst; override;
     procedure InternalLast; override;
-    procedure InternalSetToRecord(Buffer: PChar); override;
+    procedure InternalSetToRecord(Buffer: TRecordBuffer); override;
     procedure InternalGotoBookmark(ABookmark: Pointer); override;
-    procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override;
-    procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override;
-    procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override;
-    function GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override;
+    procedure SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
+    procedure SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); override;
+    procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
+    function GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; override;
     function IsCursorOpen: Boolean; override;
     function  GetRecordCount: Longint; override;
     procedure ApplyRecUpdate(UpdateKind : TUpdateKind); virtual;
@@ -1072,13 +1072,13 @@ begin
   Result:= True;
 end;
 
-function TCustomBufDataset.intAllocRecordBuffer: PChar;
+function TCustomBufDataset.intAllocRecordBuffer: TRecordBuffer;
 begin
   // Note: Only the internal buffers of TDataset provide bookmark information
   result := AllocMem(FRecordsize+sizeof(TBufRecLinkItem)*FMaxIndexesCount);
 end;
 
-function TCustomBufDataset.AllocRecordBuffer: PChar;
+function TCustomBufDataset.AllocRecordBuffer: TRecordBuffer;
 begin
   result := AllocMem(FRecordsize + BookmarkSize + CalcfieldsSize);
 // The records are initialised, or else the fields of an empty, just-opened dataset
@@ -1086,12 +1086,12 @@ begin
   InitRecord(result);
 end;
 
-procedure TCustomBufDataset.FreeRecordBuffer(var Buffer: PChar);
+procedure TCustomBufDataset.FreeRecordBuffer(var Buffer: TRecordBuffer);
 begin
   ReAllocMem(Buffer,0);
 end;
 
-procedure TCustomBufDataset.ClearCalcFields(Buffer: PChar);
+procedure TCustomBufDataset.ClearCalcFields(Buffer: TRecordBuffer);
 begin
   if CalcFieldsSize > 0 then
     FillByte((Buffer+RecordSize)^,CalcFieldsSize,0);
@@ -1136,7 +1136,7 @@ procedure TCustomBufDataset.InternalClose;
 
 var r  : integer;
     iGetResult : TGetResult;
-    pc : pchar;
+    pc : TRecordBuffer;
 
 begin
   FOpen:=False;
@@ -1199,9 +1199,9 @@ begin
   SetToLastRecord;
 end;
 
-function TDoubleLinkedBufIndex.GetCurrentRecord: PChar;
+function TDoubleLinkedBufIndex.GetCurrentRecord: TRecordBuffer;
 begin
-  Result := pchar(FCurrentRecBuf);
+  Result := TRecordBuffer(FCurrentRecBuf);
 end;
 
 function TDoubleLinkedBufIndex.GetBookmarkSize: integer;
@@ -1219,14 +1219,14 @@ begin
   Result := (FFirstRecBuf<>nil);
 end;
 
-function TDoubleLinkedBufIndex.GetSpareBuffer: PChar;
+function TDoubleLinkedBufIndex.GetSpareBuffer: TRecordBuffer;
 begin
   Result := pointer(FLastRecBuf)+(sizeof(TBufRecLinkItem)*FDataset.MaxIndexesCount);
 end;
 
-function TDoubleLinkedBufIndex.GetSpareRecord: PChar;
+function TDoubleLinkedBufIndex.GetSpareRecord: TRecordBuffer;
 begin
-  Result := pchar(FLastRecBuf);
+  Result := TRecordBuffer(FLastRecBuf);
 end;
 
 constructor TBufIndex.Create(const ADataset: TCustomBufDataset);
@@ -1351,7 +1351,7 @@ begin
     Result := True;
 end;
 
-procedure TDoubleLinkedBufIndex.InitialiseSpareRecord(const ASpareRecord : PChar);
+procedure TDoubleLinkedBufIndex.InitialiseSpareRecord(const ASpareRecord : TRecordBuffer);
 begin
   FFirstRecBuf := pointer(ASpareRecord);
   FLastRecBuf := FFirstRecBuf;
@@ -1402,7 +1402,7 @@ begin
 end;
 
 procedure TDoubleLinkedBufIndex.AddRecord;
-var ARecord: PChar;
+var ARecord: TRecordBuffer;
 begin
   ARecord := FDataset.IntAllocRecordBuffer;
   FLastRecBuf[IndNr].next := pointer(ARecord);
@@ -1411,7 +1411,7 @@ begin
   FLastRecBuf := FLastRecBuf[IndNr].next;
 end;
 
-procedure TDoubleLinkedBufIndex.InsertRecordBeforeCurrentRecord(const ARecord: PChar);
+procedure TDoubleLinkedBufIndex.InsertRecordBeforeCurrentRecord(const ARecord: TRecordBuffer);
 var ANewRecord : PBufRecLinkItem;
 begin
   ANewRecord:=PBufRecLinkItem(ARecord);
@@ -1434,7 +1434,7 @@ begin
   if FCursOnFirstRec then FCurrentRecBuf:=FLastRecBuf;
 end;
 
-procedure TCustomBufDataset.CurrentRecordToBuffer(Buffer: PChar);
+procedure TCustomBufDataset.CurrentRecordToBuffer(Buffer: TRecordBuffer);
 var ABookMark : PBufBookmark;
 begin
   with FCurrentIndex do
@@ -1472,7 +1472,7 @@ begin
     end;
 end;
 
-function TCustomBufDataset.GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
+function TCustomBufDataset.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
 
 var Acceptable : Boolean;
     SaveState : TDataSetState;
@@ -1607,27 +1607,27 @@ begin
     DatabaseError(SMinIndexes);
 end;
 
-procedure TCustomBufDataset.InternalSetToRecord(Buffer: PChar);
+procedure TCustomBufDataset.InternalSetToRecord(Buffer: TRecordBuffer);
 begin
   FCurrentIndex.GotoBookmark(PBufBookmark(Buffer+FRecordSize));
 end;
 
-procedure TCustomBufDataset.SetBookmarkData(Buffer: PChar; Data: Pointer);
+procedure TCustomBufDataset.SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
 begin
   PBufBookmark(Buffer + FRecordSize)^ := PBufBookmark(Data)^;
 end;
 
-procedure TCustomBufDataset.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);
+procedure TCustomBufDataset.SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag);
 begin
   PBufBookmark(Buffer + FRecordSize)^.BookmarkFlag := Value;
 end;
 
-procedure TCustomBufDataset.GetBookmarkData(Buffer: PChar; Data: Pointer);
+procedure TCustomBufDataset.GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
 begin
   PBufBookmark(Data)^ := PBufBookmark(Buffer + FRecordSize)^;
 end;
 
-function TCustomBufDataset.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
+function TCustomBufDataset.GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag;
 begin
   Result := PBufBookmark(Buffer + FRecordSize)^.BookmarkFlag;
 end;
@@ -1642,7 +1642,7 @@ end;
 function TCustomBufDataset.getnextpacket : integer;
 
 var i : integer;
-    pb : pchar;
+    pb : TRecordBuffer;
 
 begin
   if FAllPacketsFetched then
@@ -1747,7 +1747,7 @@ begin
     Result := GetRecordUpdateBuffer(ABookmark,IncludePrior);
 end;
 
-function TCustomBufDataset.LoadBuffer(Buffer : PChar): TGetResult;
+function TCustomBufDataset.LoadBuffer(Buffer : TRecordBuffer): TGetResult;
 
 var NullMask        : pbyte;
     x               : longint;
@@ -1791,7 +1791,7 @@ begin
   Result := grOK;
 end;
 
-function TCustomBufDataset.GetCurrentBuffer: PChar;
+function TCustomBufDataset.GetCurrentBuffer: TRecordBuffer;
 begin
   if State = dsFilter then Result := FFilterBuffer
   else if state = dsCalcFields then Result := CalcBuffer
@@ -1807,7 +1807,7 @@ end;
 
 function TCustomBufDataset.GetFieldData(Field: TField; Buffer: Pointer): Boolean;
 
-var CurrBuff : pchar;
+var CurrBuff : TRecordBuffer;
 
 begin
   Result := False;
@@ -1935,7 +1935,7 @@ procedure TCustomBufDataset.CancelUpdates;
 var StoreRecBM     : TBufBookmark;
   procedure CancelUpdBuffer(var AUpdBuffer : TRecUpdateBuffer);
   var
-    TmpBuf         : PChar;
+    TmpBuf         : TRecordBuffer;
     StoreUpdBuf    : integer;
     Bm             : TBufBookmark;
     x              : Integer;
@@ -1945,15 +1945,15 @@ var StoreRecBM     : TBufBookmark;
       if (UpdateKind = ukModify) then
         begin
         FCurrentIndex.GotoBookmark(@BookmarkData);
-        move(pchar(OldValuesBuffer)^,pchar(FCurrentIndex.CurrentBuffer)^,FRecordSize);
+        move(TRecordBuffer(OldValuesBuffer)^,TRecordBuffer(FCurrentIndex.CurrentBuffer)^,FRecordSize);
         FreeRecordBuffer(OldValuesBuffer);
         end
       else if (UpdateKind = ukDelete) and (assigned(OldValuesBuffer)) then
         begin
         FCurrentIndex.GotoBookmark(@NextBookmarkData);
-        FCurrentIndex.InsertRecordBeforeCurrentRecord(PChar(BookmarkData.BookmarkData));
+        FCurrentIndex.InsertRecordBeforeCurrentRecord(TRecordBuffer(BookmarkData.BookmarkData));
         FCurrentIndex.ScrollBackward;
-        move(pchar(OldValuesBuffer)^,pchar(FCurrentIndex.CurrentBuffer)^,FRecordSize);
+        move(TRecordBuffer(OldValuesBuffer)^,TRecordBuffer(FCurrentIndex.CurrentBuffer)^,FRecordSize);
 
 {        for x := length(FUpdateBuffer)-1 downto 0 do
           begin
@@ -2083,7 +2083,7 @@ begin
           begin
           FreeRecordBuffer(FUpdateBuffer[r].OldValuesBuffer);
           if FUpdateBuffer[r].UpdateKind = ukDelete then
-            FreeRecordBuffer(PChar(FUpdateBuffer[r].BookmarkData.BookmarkData));
+            FreeRecordBuffer( TRecordBuffer(FUpdateBuffer[r].BookmarkData.BookmarkData));
           FUpdateBuffer[r].BookmarkData.BookmarkData := nil;
           end
         end;
@@ -2137,7 +2137,7 @@ end;
 
 procedure TCustomBufDataset.InternalPost;
 
-Var CurrBuff     : PChar;
+Var CurrBuff     :  TRecordBuffer;
     i            : integer;
     blobbuf      : tbufblobfield;
     NullMask     : pbyte;
@@ -2272,7 +2272,7 @@ begin
 end;
 
 
-procedure TCustomBufDataset.InternalInitRecord(Buffer: PChar);
+procedure TCustomBufDataset.InternalInitRecord(Buffer:  TRecordBuffer);
 
 begin
   FillChar(Buffer^, FRecordSize, #0);
@@ -2305,7 +2305,7 @@ end;
 
 function TCustomBufDataset.GetRecNo: Longint;
 
-Var abuf            : PChar;
+Var abuf            :  TRecordBuffer;
 
 begin
   abuf := GetCurrentBuffer;
@@ -2848,7 +2848,6 @@ begin
   // check filtertext
   if Acceptable and (Length(Filter) > 0) then
     Acceptable := Boolean((FParser.ExtractFromBuffer(GetCurrentBuffer))^);
-
 end;
 
 procedure TCustomBufDataset.SetFilterText(const Value: String);
@@ -2976,7 +2975,7 @@ var CurrLinkItem    : PBufRecLinkItem;
     DBCompareStruct : TDBCompareStruct;
     FieldNr         : Integer;
     StoreDSState    : TDataSetState;
-    FilterBuffer    : PChar;
+    FilterBuffer    :  TRecordBuffer;
     FiltAcceptable  : boolean;
 
 begin
@@ -3059,10 +3058,10 @@ end;
 
 function TArrayBufIndex.GetCurrentBuffer: Pointer;
 begin
-  Result:=pchar(FRecordArray[FCurrentRecInd]);
+  Result:=TRecordBuffer(FRecordArray[FCurrentRecInd]);
 end;
 
-function TArrayBufIndex.GetCurrentRecord: PChar;
+function TArrayBufIndex.GetCurrentRecord:  TRecordBuffer;
 begin
   Result:=GetCurrentBuffer;
 end;
@@ -3072,15 +3071,15 @@ begin
   Result:=Length(FRecordArray)>0;
 end;
 
-function TArrayBufIndex.GetSpareBuffer: PChar;
+function TArrayBufIndex.GetSpareBuffer:  TRecordBuffer;
 begin
   if FLastRecInd>-1 then
-    Result:=pchar(FRecordArray[FLastRecInd])
+    Result:= TRecordBuffer(FRecordArray[FLastRecInd])
   else
     Result := nil;
 end;
 
-function TArrayBufIndex.GetSpareRecord: PChar;
+function TArrayBufIndex.GetSpareRecord:  TRecordBuffer;
 begin
   Result := GetSpareBuffer;
 end;
@@ -3205,7 +3204,7 @@ begin
   FLastRecInd:=-1;
 end;
 
-procedure TArrayBufIndex.InitialiseSpareRecord(const ASpareRecord: PChar);
+procedure TArrayBufIndex.InitialiseSpareRecord(const ASpareRecord:  TRecordBuffer);
 begin
   FLastRecInd := 0;
  // FCurrentRecInd := 0;
@@ -3230,7 +3229,7 @@ begin
   dec(FLastRecInd);
 end;
 
-procedure TArrayBufIndex.InsertRecordBeforeCurrentRecord(const ARecord: PChar);
+procedure TArrayBufIndex.InsertRecordBeforeCurrentRecord(const ARecord:  TRecordBuffer);
 begin
   inc(FLastRecInd);
   if FLastRecInd >= length(FRecordArray) then
@@ -3247,7 +3246,7 @@ begin
 end;
 
 procedure TArrayBufIndex.AddRecord;
-var ARecord: PChar;
+var ARecord:  TRecordBuffer;
 begin
   ARecord := FDataset.IntAllocRecordBuffer;
   inc(FLastRecInd);
@@ -3418,7 +3417,7 @@ begin
   result := FSPareBuffer;
 end;
 
-function TUniDirectionalBufIndex.GetCurrentRecord: PChar;
+function TUniDirectionalBufIndex.GetCurrentRecord:  TRecordBuffer;
 begin
 //  Result:=inherited GetCurrentRecord;
 end;
@@ -3428,12 +3427,12 @@ begin
   Result := Assigned(FSPareBuffer);
 end;
 
-function TUniDirectionalBufIndex.GetSpareBuffer: PChar;
+function TUniDirectionalBufIndex.GetSpareBuffer:  TRecordBuffer;
 begin
   result := FSPareBuffer;
 end;
 
-function TUniDirectionalBufIndex.GetSpareRecord: PChar;
+function TUniDirectionalBufIndex.GetSpareRecord:  TRecordBuffer;
 begin
   result := FSPareBuffer;
 end;
@@ -3514,7 +3513,7 @@ begin
   // do nothing
 end;
 
-procedure TUniDirectionalBufIndex.InitialiseSpareRecord(const ASpareRecord: PChar);
+procedure TUniDirectionalBufIndex.InitialiseSpareRecord(const ASpareRecord:  TRecordBuffer);
 begin
   FSPareBuffer:=ASpareRecord;
 end;
@@ -3544,7 +3543,7 @@ begin
   // Do nothing
 end;
 
-procedure TUniDirectionalBufIndex.InsertRecordBeforeCurrentRecord(const ARecord: PChar);
+procedure TUniDirectionalBufIndex.InsertRecordBeforeCurrentRecord(const ARecord:  TRecordBuffer);
 begin
   // Do nothing
 end;

+ 16 - 16
packages/fcl-db/src/base/bufdataset_parser.pp

@@ -43,7 +43,7 @@ type
     procedure ClearExpressions; override;
 
     procedure ParseExpression(AExpression: string); virtual;
-    function ExtractFromBuffer(Buffer: PChar): PChar; virtual;
+    function ExtractFromBuffer(Buffer: TRecordBuffer): PChar; virtual;
 
     property Dataset: TDataSet read FDataset; // write FDataset;
     property Expression: string read FCurrentExpression;
@@ -72,7 +72,7 @@ type
   public
     constructor Create(UseField: TField);
 
-    procedure Refresh(Buffer: PChar); virtual; abstract;
+    procedure Refresh(Buffer: TRecordBuffer); virtual; abstract;
 
     property FieldVal: Pointer read GetFieldVal;
     property FieldDef: TField read FField;
@@ -90,7 +90,7 @@ type
     constructor Create(UseField: TField);
     destructor Destroy; override;
 
-    procedure Refresh(Buffer: PChar); override;
+    procedure Refresh(Buffer: TRecordBuffer); override;
   end;
 
   TFloatFieldVar = class(TFieldVar)
@@ -100,7 +100,7 @@ type
     function GetFieldVal: Pointer; override;
     function GetFieldType: TExpressionType; override;
   public
-    procedure Refresh(Buffer: PChar); override;
+    procedure Refresh(Buffer: TRecordBuffer); override;
   end;
 
   TIntegerFieldVar = class(TFieldVar)
@@ -110,7 +110,7 @@ type
     function GetFieldVal: Pointer; override;
     function GetFieldType: TExpressionType; override;
   public
-    procedure Refresh(Buffer: PChar); override;
+    procedure Refresh(Buffer: TRecordBuffer); override;
   end;
 
   TLargeIntFieldVar = class(TFieldVar)
@@ -120,7 +120,7 @@ type
     function GetFieldVal: Pointer; override;
     function GetFieldType: TExpressionType; override;
   public
-    procedure Refresh(Buffer: PChar); override;
+    procedure Refresh(Buffer: TRecordBuffer); override;
   end;
 
   TDateTimeFieldVar = class(TFieldVar)
@@ -130,7 +130,7 @@ type
   protected
     function GetFieldVal: Pointer; override;
   public
-    procedure Refresh(Buffer: PChar); override;
+    procedure Refresh(Buffer: TRecordBuffer); override;
   end;
 
   TBooleanFieldVar = class(TFieldVar)
@@ -140,7 +140,7 @@ type
   protected
     function GetFieldVal: Pointer; override;
   public
-    procedure Refresh(Buffer: PChar); override;
+    procedure Refresh(Buffer: TRecordBuffer); override;
   end;
 
 //--TFieldVar----------------------------------------------------------------
@@ -179,7 +179,7 @@ begin
   inherited;
 end;
 
-procedure TStringFieldVar.Refresh(Buffer: PChar);
+procedure TStringFieldVar.Refresh(Buffer: TRecordBuffer);
 var Fieldbuf : TStringFieldBuffer;
     s        : string;
 begin
@@ -201,7 +201,7 @@ begin
   Result := etFloat;
 end;
 
-procedure TFloatFieldVar.Refresh(Buffer: PChar);
+procedure TFloatFieldVar.Refresh(Buffer: TRecordBuffer);
 begin
   if not FField.DataSet.GetFieldData(FField,@FFieldVal) then
     FFieldVal := 0;
@@ -218,7 +218,7 @@ begin
   Result := etInteger;
 end;
 
-procedure TIntegerFieldVar.Refresh(Buffer: PChar);
+procedure TIntegerFieldVar.Refresh(Buffer: TRecordBuffer);
 begin
   if not FField.DataSet.GetFieldData(FField,@FFieldVal) then
     FFieldVal := 0;
@@ -235,7 +235,7 @@ begin
   Result := etLargeInt;
 end;
 
-procedure TLargeIntFieldVar.Refresh(Buffer: PChar);
+procedure TLargeIntFieldVar.Refresh(Buffer: TRecordBuffer);
 begin
   if not FField.DataSet.GetFieldData(FField,@FFieldVal) then
     FFieldVal := 0;
@@ -252,7 +252,7 @@ begin
   Result := etDateTime;
 end;
 
-procedure TDateTimeFieldVar.Refresh(Buffer: PChar);
+procedure TDateTimeFieldVar.Refresh(Buffer:TRecordBuffer );
 begin
   if not FField.DataSet.GetFieldData(FField,@FFieldVal) then
     FFieldVal := 0;
@@ -269,7 +269,7 @@ begin
   Result := etBoolean;
 end;
 
-procedure TBooleanFieldVar.Refresh(Buffer: PChar);
+procedure TBooleanFieldVar.Refresh(Buffer: TRecordBuffer);
 begin
   if not FField.DataSet.GetFieldData(FField,@FFieldVal) then
     FFieldVal := False;
@@ -437,7 +437,7 @@ end;
 
 procedure TBufDatasetParser.ParseExpression(AExpression: string);
 var
-  TempBuffer: pchar;
+  TempBuffer: TRecordBuffer;
 begin
   // clear any current expression
   ClearExpressions;
@@ -486,7 +486,7 @@ begin
   FCurrentExpression := AExpression;
 end;
 
-function TBufDatasetParser.ExtractFromBuffer(Buffer: PChar): PChar;
+function TBufDatasetParser.ExtractFromBuffer(Buffer: TRecordBuffer): PChar;
 var
   I: Integer;
 begin

+ 26 - 27
packages/fcl-db/src/base/dataset.inc

@@ -30,7 +30,7 @@ begin
   FConstraints:=TCheckConstraints.Create(Self);
   
 // FBuffer must be allocated on create, to make Activebuffer return nil
-  ReAllocMem(FBuffers,SizeOf(PChar));
+  ReAllocMem(FBuffers,SizeOf(TRecordBuffer));
 //  pointer(FBuffers^) := nil;
   FBuffers[0] := nil;
   FActiveRecord := 0;
@@ -138,12 +138,11 @@ begin
           and (getBookMarkFlag(ActiveBuffer)=bfCurrent);
 end;
 
-Procedure TDataset.CalculateFields(Buffer: PChar);
+Procedure TDataset.CalculateFields(Buffer: TRecordBuffer);
 var
   i: Integer;
 begin
-  FCalcBuffer := Buffer;
-  
+  FCalcBuffer := Buffer; 
   if not IsUniDirectional and (FState <> dsInternalCalc) then try
     ClearCalcFields(FCalcBuffer);
     for i := 0 to FFieldList.Count - 1 do
@@ -178,7 +177,7 @@ begin
   FEOF:=True;
 end;
 
-Procedure TDataset.ClearCalcFields(Buffer: PChar);
+Procedure TDataset.ClearCalcFields(Buffer: TRecordBuffer);
 
 begin
   // Empty
@@ -466,13 +465,13 @@ begin
     end
 end;
 
-Function TDataset.GetBuffer (Index : longint) : Pchar;
+Function TDataset.GetBuffer (Index : longint) : TRecordBuffer;
 
 begin
   Result:=FBuffers[Index];
 end;
 
-Procedure TDataset.GetCalcFields(Buffer: PChar);
+Procedure TDataset.GetCalcFields(Buffer: TRecordBuffer);
 
 var
   dss: TDataSetState;
@@ -936,7 +935,7 @@ begin
     end;
 end;
 
-Procedure TDataset.InitRecord(Buffer: PChar);
+Procedure TDataset.InitRecord(Buffer: TRecordBuffer);
 
 begin
   InternalInitRecord(Buffer);
@@ -990,7 +989,7 @@ begin
   end;
 end;
 
-Procedure TDataset.RefreshInternalCalcFields(Buffer: PChar);
+Procedure TDataset.RefreshInternalCalcFields(Buffer: TRecordBuffer);
 
 begin
   //!! To be implemented
@@ -1026,7 +1025,7 @@ begin
     ShowException(ExceptObject,ExceptAddr);
 end;
 
-procedure TDataSet.InternalInitRecord(Buffer: PChar);
+procedure TDataSet.InternalInitRecord(Buffer: TRecordBuffer);
 begin
   // empty stub
 end;
@@ -1055,17 +1054,17 @@ begin
   Checkrequired;
 end;
 
-procedure TDataSet.InternalSetToRecord(Buffer: PChar);
+procedure TDataSet.InternalSetToRecord(Buffer: TRecordBuffer);
 begin
   // empty stub
 end;
 
-procedure TDataSet.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);
+procedure TDataSet.SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag);
 begin
   // empty stub
 end;
 
-procedure TDataSet.SetBookmarkData(Buffer: PChar; Data: Pointer);
+procedure TDataSet.SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
 begin
   // empty stub
 end;
@@ -1194,25 +1193,25 @@ begin
   If Value>FBufferCount then
     begin
 {$ifdef dsdebug}
-    Writeln ('   Reallocating memory :',(Value+1)*SizeOf(PChar));
+    Writeln ('   Reallocating memory :',(Value+1)*SizeOf(TRecordBuffer));
 {$endif}
     ReAllocMem(FBuffers,(Value+1)*SizeOf(PChar));
 {$ifdef dsdebug}
-    Writeln ('   Filling memory :',(Value+1-FBufferCount)*SizeOf(PChar));
+    Writeln ('   Filling memory :',(Value+1-FBufferCount)*SizeOf(TRecordBuffer));
 {$endif}
     inc(FBufferCount); // Cause FBuffers[FBufferCount] is already allocated
-    FillChar(FBuffers[FBufferCount],(Value+1-FBufferCount)*SizeOF(Pchar),#0);
+    FillChar(FBuffers[FBufferCount],(Value+1-FBufferCount)*SizeOF(TRecordBuffer),#0);
 {$ifdef dsdebug}
     Writeln ('   Filled memory :');
 {$endif}
     Try
 {$ifdef dsdebug}
-      Writeln ('   Assigning buffers :',(Value)*SizeOf(PChar));
+      Writeln ('   Assigning buffers :',(Value)*SizeOf(TRecordBuffer));
 {$endif}
       For I:=FBufferCount to Value do
         FBuffers[i]:=AllocRecordBuffer;
 {$ifdef dsdebug}
-      Writeln ('   Assigned buffers ',FBufferCount,' :',(Value)*SizeOf(PChar));
+      Writeln ('   Assigned buffers ',FBufferCount,' :',(Value)*SizeOf(TRecordBuffer));
 {$endif}
     except
       I:=FBufferCount;
@@ -1243,11 +1242,11 @@ begin
       // FBuffer must stay allocated, to make sure that Activebuffer returns nil
       if Value = -1 then
         begin
-        ReAllocMem(FBuffers,SizeOf(Pchar));
+        ReAllocMem(FBuffers,SizeOf(TRecordBuffer));
         FBuffers[0] := nil;
         end
       else
-        ReAllocMem(FBuffers,(Value+1)*SizeOf(Pchar));
+        ReAllocMem(FBuffers,(Value+1)*SizeOf(TRecordBuffer));
       end;
     end;
   FBufferCount:=Value;
@@ -1388,7 +1387,7 @@ begin
     end;
 end;
 
-Function TDataset.Tempbuffer: PChar;
+Function TDataset.Tempbuffer: TRecordBuffer;
 
 begin
   Result := FBuffers[FRecordCount];
@@ -1400,22 +1399,22 @@ begin
   // Empty Abstract
 end;
 
-function TDataSet.AllocRecordBuffer: PChar;
+function TDataSet.AllocRecordBuffer: TRecordBuffer;
 begin
   Result := nil;
 end;
 
-procedure TDataSet.FreeRecordBuffer(var Buffer: PChar);
+procedure TDataSet.FreeRecordBuffer(var Buffer: TRecordBuffer);
 begin
   // empty stub
 end;
 
-procedure TDataSet.GetBookmarkData(Buffer: PChar; Data: Pointer);
+procedure TDataSet.GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer);
 begin
   // empty stub
 end;
 
-function TDataSet.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
+function TDataSet.GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag;
 begin
   Result := bfCurrent;
 end;
@@ -1426,7 +1425,7 @@ begin
   Result := (FDisableControlsCount > 0);
 end;
 
-Function TDataset.ActiveBuffer: PChar;
+Function TDataset.ActiveBuffer: TRecordBuffer;
 
 begin
 {$ifdef dsdebug}
@@ -1816,7 +1815,7 @@ begin
     Result:=Nil;
 end;
 
-Function TDataset.GetCurrentRecord(Buffer: PChar): Boolean;
+Function TDataset.GetCurrentRecord(Buffer: TRecordBuffer): Boolean;
 
 
 begin

+ 33 - 24
packages/fcl-db/src/base/db.pas

@@ -1250,9 +1250,18 @@ type
   PBookmarkFlag = ^TBookmarkFlag;
   TBookmarkFlag = (bfCurrent, bfBOF, bfEOF, bfInserted);
 
+{ These types are used by Delphi/Unicode to replace the ambiguous "pchar" buffer types.
+  For now, they are just aliases to PAnsiChar, but in Delphi/Unicode it is pbyte. This will
+  be changed later (2.8?), to allow a grace period for descendents to catch up.
+  
+  Testing with TRecordBuffer=PByte will turn up typing problems. TRecordBuffer=pansichar is backwards
+  compatible, even if overriden with "pchar" variants.
+}
+  TRecordBuffer = PAnsiChar;
   PBufferList = ^TBufferList;
-  TBufferList = array[0..dsMaxBufferCount - 1] of PChar;
-
+  TBufferList = array[0..dsMaxBufferCount - 1] of TRecordBuffer;  // Dynamic array in Delphi.
+  TBufferArray = ^TRecordBuffer;
+  
   TGetMode = (gmCurrent, gmNext, gmPrior);
 
   TGetResult = (grOK, grBOF, grEOF, grError);
@@ -1282,7 +1291,7 @@ type
     var Accept: Boolean) of object;
 
   TDatasetClass = Class of TDataset;
-  TBufferArray = ^pchar;
+
 
 {------------------------------------------------------------------------------}
 {IProviderSupport interface}
@@ -1355,7 +1364,7 @@ type
     FBookmarkSize: Longint;
     FBuffers : TBufferArray;
     FBufferCount: Longint;
-    FCalcBuffer: PChar;
+    FCalcBuffer: TRecordBuffer;
     FCalcFieldsSize: Longint;
     FConstraints: TCheckConstraints;
     FDisableControlsCount : Integer;
@@ -1385,7 +1394,7 @@ type
     FInternalOpenComplete: Boolean;
     Procedure DoInsertAppend(DoAppend : Boolean);
     Procedure DoInternalOpen;
-    Function  GetBuffer (Index : longint) : Pchar;
+    Function  GetBuffer (Index : longint) : TRecordBuffer;
     Function  GetField (Index : Longint) : TField;
     Procedure RegisterDataSource(ADatasource : TDataSource);
     Procedure RemoveField (Field : TField);
@@ -1404,13 +1413,13 @@ type
     procedure ActivateBuffers; virtual;
     procedure BindFields(Binding: Boolean);
     function  BookmarkAvailable: Boolean;
-    procedure CalculateFields(Buffer: PChar); virtual;
+    procedure CalculateFields(Buffer: TRecordBuffer); virtual;
     procedure CheckActive; virtual;
     procedure CheckInactive; virtual;
     procedure CheckBiDirectional;
     procedure Loaded; override;
     procedure ClearBuffers; virtual;
-    procedure ClearCalcFields(Buffer: PChar); virtual;
+    procedure ClearCalcFields(Buffer: TRecordBuffer); virtual;
     procedure CloseBlob(Field: TField); virtual;
     procedure CloseCursor; virtual;
     procedure CreateFields; virtual;
@@ -1440,7 +1449,7 @@ type
     function  FindRecord(Restart, GoForward: Boolean): Boolean; virtual;
     procedure FreeFieldBuffers; virtual;
     function  GetBookmarkStr: TBookmarkStr; virtual;
-    procedure GetCalcFields(Buffer: PChar); virtual;
+    procedure GetCalcFields(Buffer: TRecordBuffer); virtual;
     function  GetCanModify: Boolean; virtual;
     procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
     function  GetFieldClass(FieldType: TFieldType): TFieldClass; virtual;
@@ -1456,14 +1465,14 @@ type
     function  GetRecNo: Longint; virtual;
     procedure InitFieldDefs; virtual;
     procedure InitFieldDefsFromfields;
-    procedure InitRecord(Buffer: PChar); virtual;
+    procedure InitRecord(Buffer: TRecordBuffer); virtual;
     procedure InternalCancel; virtual;
     procedure InternalEdit; virtual;
     procedure InternalInsert; virtual;
     procedure InternalRefresh; virtual;
     procedure OpenCursor(InfoQuery: Boolean); virtual;
     procedure OpenCursorcomplete; virtual;
-    procedure RefreshInternalCalcFields(Buffer: PChar); virtual;
+    procedure RefreshInternalCalcFields(Buffer: TRecordBuffer); virtual;
     procedure RestoreState(const Value: TDataSetState);
     Procedure SetActive (Value : Boolean); virtual;
     procedure SetBookmarkStr(const Value: TBookmarkStr); virtual;
@@ -1482,22 +1491,22 @@ type
     procedure SetRecNo(Value: Longint); virtual;
     procedure SetState(Value: TDataSetState);
     function SetTempState(const Value: TDataSetState): TDataSetState;
-    Function Tempbuffer: PChar;
+    Function Tempbuffer: TRecordBuffer;
     procedure UpdateIndexDefs; virtual;
     property ActiveRecord: Longint read FActiveRecord;
     property CurrentRecord: Longint read FCurrentRecord;
     property BlobFieldCount: Longint read FBlobFieldCount;
     property BookmarkSize: Longint read FBookmarkSize write FBookmarkSize;
-    property Buffers[Index: Longint]: PChar read GetBuffer;
+    property Buffers[Index: Longint]: TRecordBuffer read GetBuffer;
     property BufferCount: Longint read FBufferCount;
-    property CalcBuffer: PChar read FCalcBuffer;
+    property CalcBuffer: TRecordBuffer read FCalcBuffer;
     property CalcFieldsSize: Longint read FCalcFieldsSize;
     property InternalCalcFields: Boolean read FInternalCalcFields;
     property Constraints: TCheckConstraints read FConstraints write FConstraints;
-    function AllocRecordBuffer: PChar; virtual;
-    procedure FreeRecordBuffer(var Buffer: PChar); virtual;
-    procedure GetBookmarkData(Buffer: PChar; Data: Pointer); virtual;
-    function GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; virtual;
+    function AllocRecordBuffer: TRecordBuffer; virtual;
+    procedure FreeRecordBuffer(var Buffer: TRecordBuffer); virtual;
+    procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); virtual;
+    function GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; virtual;
     function GetDataSource: TDataSource; virtual;
     function GetRecordSize: Word; virtual;
     procedure InternalAddRecord(Buffer: Pointer; AAppend: Boolean); virtual;
@@ -1505,15 +1514,15 @@ type
     procedure InternalFirst; virtual;
     procedure InternalGotoBookmark(ABookmark: Pointer); virtual;
     procedure InternalHandleException; virtual;
-    procedure InternalInitRecord(Buffer: PChar); virtual;
+    procedure InternalInitRecord(Buffer: TRecordBuffer); virtual;
     procedure InternalLast; virtual;
     procedure InternalPost; virtual;
-    procedure InternalSetToRecord(Buffer: PChar); virtual;
-    procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); virtual;
-    procedure SetBookmarkData(Buffer: PChar; Data: Pointer); virtual;
+    procedure InternalSetToRecord(Buffer: TRecordBuffer); virtual;
+    procedure SetBookmarkFlag(Buffer: TRecordBuffer; Value: TBookmarkFlag); virtual;
+    procedure SetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); virtual;
     procedure SetUniDirectional(const Value: Boolean);
   protected { abstract methods }
-    function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; virtual; abstract;
+    function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; virtual; abstract;
     procedure InternalClose; virtual; abstract;
     procedure InternalOpen; virtual; abstract;
     procedure InternalInitFieldDefs; virtual; abstract;
@@ -1547,7 +1556,7 @@ type
   public
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
-    function ActiveBuffer: PChar;
+    function ActiveBuffer: TRecordBuffer;
     function GetFieldData(Field: TField; Buffer: Pointer): Boolean; overload; virtual;
     function GetFieldData(Field: TField; Buffer: Pointer; NativeFormat: Boolean): Boolean; overload; virtual;
     procedure SetFieldData(Field: TField; Buffer: Pointer); overload; virtual;
@@ -1577,7 +1586,7 @@ type
     procedure First;
     procedure FreeBookmark(ABookmark: TBookmark); virtual;
     function GetBookmark: TBookmark; virtual;
-    function GetCurrentRecord(Buffer: PChar): Boolean; virtual;
+    function GetCurrentRecord(Buffer: TRecordBuffer): Boolean; virtual;
     procedure GetFieldList(List: TList; const FieldNames: string);
     procedure GetFieldNames(List: TStrings);
     procedure GotoBookmark(ABookmark: TBookmark);