Delphiでグリッドに列を挿入する

環境はDelphi 6。
グリッドはとりあえずTStringGridを使う。


プログラム中でグリッドに列を挿入したいとき、

procedure InsertCol(G: TStringGrid; c: Integer);
var
    i, j: Integer;
begin
    G.ColCount := G.ColCount + 1;

    for i := G.ColCount - 1 downto c + 1 do
        for j := G.FixedRows to G.RowCount - 1 do
            G.Cells[i, j] := G.Cells[i - 1, j];
end;

みたいに自分で列のデータを移動したりするのは面倒だし、グローバルにこの関数を置きたくない。


まず、自分で列のデータを移動するのは面倒という話。
そもそもドラッグで列移動できるのに、それ用のメソッドが無いわけない。
それがこれ。

procedure TCustomGrid.MoveColumn(fromCol, toCol: Integer);

ただし、protected。
つまり、このメソッドを使うためにはTCustomGridを継承したコンポーネントを新たに作らなければならない。
すると、新たに作ったコンポーネントをパレットに追加しなければならない。
それは、嫌だ。


プログラム中で継承すればいい。

type
    TExGrid = class(TStringGrid)
    public
        procedure InsertCol(c: Integer);
    end;

として、実際の呼び出しには

procedure Test(G: TStringGrid);
begin
    TExGrid(G).InsertCol;
end;

のようにダウンキャストしてやればよい。
「グローバルにあの関数を置きたくない」はこれで解決。


メソッドの実装は簡単に*1こんな感じになる。

procedure TExGrid.InsertCol(c: Integer);
begin
    ColCount := ColCount + 1;

    MoveColumn(ColCount - 1, c);
end;

「自分で列のデータを移動するのは面倒」も解決した。


ちなみに他にも

procedure DeleteRow(ARow: Integer);
procedure DeleteColumn(ACol: Integer);
procedure MoveRow(fromRow, toRow: Integer);

などがprotectedで隠されている。

*1:引数のチェックやらグリッドの選択領域の処理やらは省略