Du musst dir die aktuelle Zeile merken und hinterher wieder setzen.
Ich habe sowas mal gebaut gehabt um bei einem Refresh über einen Timer die Ansicht beizubehalten:
Delphi-Quellcode:
procedure TMyForm.RefreshTimerTimer(Sender: TObject);
var
rowDelta: integer;
row: integer;
recNo: integer;
TempScrollInfo: SCROLLINFO;
begin
// Position des aktuellen Datensatzes (vertical)
rowDelta := -1 + MyDBGrid.Row;
row := MyDBGrid.DataSource.DataSet.RecNo;
// Position der horizontalen Scrollbar
TempScrollInfo.cbSize := SizeOf(SCROLLINFO);
TempScrollInfo.fMask := SIF_POS;
GetScrollInfo(MyDBGrid.Handle, SB_HORZ, TempScrollInfo );
MyDBGrid.DataSource.DataSet.DisableControls;
try
MyZQuery.Refresh;
// Die Ansicht wiederherstellen (vertical)
with MyDBGrid.DataSource.DataSet do
begin
RecNo := row;
MoveBy(-rowDelta) ;
MoveBy(rowDelta) ;
end;
finally
MyDBGrid.DataSource.DataSet.EnableControls;
//Die horizontale Scrollposition wiederherstellen
SetScrollInfo(MyDBGrid.Handle, SB_HORZ, TempScrollInfo, true);
end;
end;