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;