StringGrid で行削除/列削除

StringGrid で行や列を削除するには ColCount や RowCount を減らすという手がありますが、その場合最後尾のものしかいじれません。
それならば任意の行を末尾に飛ばしてしまえばいい(MoveColumn, MoveRow)のです・・・がこれだと最後尾に現在位置が飛んでいってしまいます。
ちなみに上2つの動作を行う DeleteColumn, DeleteRow というメソッドは存在しています。
ならば現在位置と画面に表示されている一番先頭の位置(LeftCol, TopRow)を記憶しておいて元に戻せばいい・・・のですが、その場合は描画のせいで、画面がちらつくなんてもんじゃありません。
というわけで、最後に前述のちらつきを押さえる方法を組み合わせて完成です。

procedure TStringGridEx.RemoveColumn(ACol: Integer);
var
  KeepLeftCol, KeepCol: Integer;
begin
  KeepCol := Col;
  KeepLeftCol := LeftCol;

  BeginUpdate;
  try
    DeleteColumn(ACol);

    if ColCount > KeepCol then Col := KeepCol
    else Col := KeepCol - 1;
    LeftCol := KeepLeftCol;

    SetFocus;
  finally
    EndUpdate;
  end;
end;

procedure TStringGridEx.RemoveRow(ARow: Integer);
var
  KeepTopRow, KeepRow: Integer;
begin
  KeepRow := Row;
  KeepTopRow := TopRow;

  BeginUpdate;
  try
    DeleteRow(ARow);

    if RowCount > KeepRow then Row := KeepRow
    else Row := KeepRow - 1;
    TopRow := KeepTopRow;

    SetFocus;
  finally
    EndUpdate;
  end;
end;

Return index page