From 6c5a594a9041a04af0fbe22332e951e4285897c1 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Sat, 11 May 2019 16:05:27 +0000 Subject: [PATCH] TParadoxDataset: Add bookmark support. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6907 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- components/tparadoxdataset/paradoxds.pas | 55 ++++++++++++++++++------ 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/components/tparadoxdataset/paradoxds.pas b/components/tparadoxdataset/paradoxds.pas index 56eeef679..8e53258d5 100644 --- a/components/tparadoxdataset/paradoxds.pas +++ b/components/tparadoxdataset/paradoxds.pas @@ -190,7 +190,7 @@ type procedure InternalEdit; override; procedure InternalFirst; override; procedure InternalGotoBookmark(ABookmark: Pointer); override; - procedure InternalHandleException; override; +// procedure InternalHandleException; override; procedure InternalInitFieldDefs; override; procedure InternalInitRecord(Buffer: PChar); override; procedure InternalLast; override; @@ -203,6 +203,8 @@ type procedure SetRecNo(Value: Integer); override; public constructor Create(AOwner: TComponent); override; + function BookmarkValid(ABookmark: TBookmark): Boolean; override; + function CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Longint; override; function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override; function GetFieldData(Field: TField; Buffer: Pointer): Boolean; override; procedure SetFieldData({%H-}Field: TField; {%H-}Buffer: Pointer); override; @@ -242,10 +244,8 @@ type // property OnPostError; end; -implementation -uses - Forms; +implementation { TParadoxDataset } @@ -255,6 +255,7 @@ begin FHeader := nil; FTargetEncoding := Uppercase(EncodingUTF8); FInputEncoding := ''; + BookmarkSize := SizeOf(LongInt); end; function TParadoxDataset.AllocRecordBuffer: PChar; @@ -265,6 +266,26 @@ begin Result := nil; end; +function TParadoxDataset.BookmarkValid(ABookmark: TBookmark): Boolean; +begin + Result := Assigned(ABookmark) and (Length(ABookMark) <> 0); +end; + +function TParadoxDataset.CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Longint; +var + idx1, idx2: LongWord; +begin + idx1 := PLongWord(Bookmark1)^; + idx2 := PLongWord(Bookmark2)^; + if idx1 > idx2 then + Result := +1 + else + if idx1 = idx2 then + Result := 0 + else + Result := -1 +end; + function TParadoxDataset.CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; var @@ -344,7 +365,12 @@ end; procedure TParadoxDataset.GetBookmarkData(Buffer: PChar; Data: Pointer); begin - //TODO + PLongWord(Data)^ := PRecInfo(Buffer + FHeader^.RecordSize)^.RecordNumber; +end; + +function TParadoxDataset.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; +begin + Result := PRecInfo(Buffer + FHeader^.RecordSize)^.BookmarkFlag; end; function TParadoxDataset.GetCanModify: Boolean; @@ -577,14 +603,16 @@ end; procedure TParadoxDataset.InternalGotoBookmark(ABookmark: Pointer); begin - SetRecNo(PLongWord(ABookmark)^); + if BookmarkValid(ABookmark) then + SetRecNo(PLongWord(ABookmark)^); end; +{ procedure TParadoxDataset.InternalHandleException; begin Application.HandleException(Self); end; - +} procedure TParadoxDataset.InternalInitFieldDefs; var i: integer; @@ -769,12 +797,13 @@ end; procedure TParadoxDataset.SetBookmarkData(Buffer: PChar; Data: Pointer); begin - //TODO -end; - -function TParadoxDataset.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; -begin - Result := PRecInfo(Buffer + FHeader^.RecordSize)^.BookmarkFlag; + // The BookMarkData is the RecNo: no need to set nothing; +{ + if Data <> nil then + PRecInfo(Buffer + FHeader^.RecordSize)^.RecordNumber := PLongWord(Data)^ + else + PRecInfo(Buffer + FHeader^.RecordSize)^.RecordNumber := 0; + } end; procedure TParadoxDataset.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);