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:引数のチェックやらグリッドの選択領域の処理やらは省略