Yeah, the position within the grid isn't restored there. With BufDs1.Bookmark you are just restoring the dataset to the correct position. Not the TDBGrid.
I've done this in Delphi with getting the current row within the visible grid.
For instance, this will save the numbers of rows FROM THE BOTTOM of the grid.
type
TCrackDBGrid = class(TDBGrid);
// ...
x := TCrackDBGrid(Grid).VisibleRowCount - TCrackDBGrid(Grid).Row;
After restoring the bookmarj you can restore the position in the DBGrid by
x := Grid.DataSource.DataSet.MoveBy(x);
x := Grid.DataSource.DataSet.MoveBy(-x);
The first line will move x records further scrolling bottom of the DBGrid to the exact position needed. The second scrolls back to your position. After that your grid will be exactly as before.
(Note: This was done by me for Delphi in the past. I'm not sure if there is a better method in the meantime.)