AsuYuHomepage
トップページ サイトの説明 子供の成長記録 JM BAR Delphi リンク集
Home>>プログラミング>>Tips&Tricks>>StringGridの使い方
Delphi Tips
Delphi Win32API
ダウンロード

Counter

Delphi Tips & Tricks

StringGridの使い方

 意外とよく使われるTStringGrid、色々な機能があるので慣れるまでは使いこなすのが大変かもしれません。
 このページではそんなStringGrid基本的な使い方から、便利な小技までをまとめてみました。

1.StringGirdの基本的なプロパティ
Cells
セルの内容文字列、縦・横のインデックスで場所を指定
Col(Row)
選択されているセルの列(行)のインデックス番号
Col(Row)Count
グリッド内の列(行)の数
Cols(Rows)
各列(行)の内容文字列を保持している配列
ColWidths, RowHeights
各列(行)の幅(高さ)を保持している配列
DefaultColWidth
デフォルトの列の幅
DefaultRowHeight
デフォルトの行の高さ
EditerMode
現在のセルを編集できるかを表すフラグ
FixedColor
固定セルの色
FixedCols(Rows)
固定セルの列(行)の数
Grid(Width)Height
グリッドの幅・高さ
GridLineWidth
セル同士を隔てる枠の幅
Selection
セルの範囲の指定(TGridRect型)
Options
集合型でグリッドの特徴を設定する以下のフラグの集まり
goFixedVertLine
固定列を隔てる垂直線の描画の有無
g0FixedHorzLine
固定列を隔てる水平線の描画の有無
goVertLine
列を分ける垂直線の描画の有無
goHorzLine
行を分ける水平線の描画の有無
goRangeSelect
範囲選択ができるか
goDrawFocusSelected
フォーカスのあるセルを強調表示するかどうか
goRowSizing
各行がサイズ変更可能かどうか
goColSizing
各列がサイズ変更可能かどうか
goRowMoving
各行がマウスで移動可能かどうか
goColMoving
各列がマウスで移動可能かどうか
goEditing
セルの内容を編集可能かどうか
goTabs
Tabキーでフォーカスを移動できるかどうか
goRowSelect
行全体を選択できるかどうか
goAlwaysShowEditor
常に編集状態にする
goThumbTracking
ドラッグ中グリッド内容のスクロールを行うかどうか
2.StringGridの主なイベント
OnColumnMoved
列の位置が変わったときのイベント
OnRowMoved
行の位置が変わったときのイベント
OnDrawCell
各セルを描画するときに呼び出されるイベント
OnSelectCell
セルが選択される直前に呼び出されるイベント
OnSetEdittext
セルを編集したときに呼び出されるイベント
3.StringGridの主なメソッド
function CellRect(ACol, ARow: Longint): TRect;
指定されたセルを示す長方形の画面座標値を返します。
procedure MouseToCell(X, Y: Integer; var ACol, ARow: Longint);
指定した座標にあるセルを取得します。
function MouseCoord(X, Y: Integer): TGridCoord;
座標値のセルの行・列のインデックスを返します。
4.StringGridの小技集

//行ごとに背景色を変えて描画
//DefaultDwawing = Falseに設定
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if (Acol < StringGrid1.FixedCols) or
     (ARow < StringGrid1.FixedRows) then
    //固定セルの背景色
    StringGrid1.Canvas.Brush.Color :=StringGrid1.FixedColor
  else if (ARow mod 2 =1) then
    //奇数行の背景色
    StringGrid1.Canvas.Brush.Color :=clAqua
  else
    //偶数セルの背景色
    StringGrid1.Canvas.Brush.Color :=StringGrid1.Color;

  StringGrid1.Canvas.FillRect(Rect);
  //テキスト描画位置を少し右にずらす
  Rect.Left :=Rect.Left +2;

  DrawText(StringGrid1.Canvas.Handle,
           PChar(StringGrid1.Cells[ACol, ARow]),
           Length(StringGrid1.Cells[ACol, ARow]),
           Rect,
           DT_VCENTER or DT_SINGLELINE);
end;

//セル内容を右寄せで描画
//DefaultDwawing = Falseに設定
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  DrawText(StringGrid1.Canvas.Handle,
           PChar(StringGrid1.Cells[ACol, ARow]),
           Length(StringGrid1.Cells[ACol, ARow]),
           Rect,
           DT_VCENTER or DT_SINGLELINE or DT_RIGHT);
end;

//セルの値によりフォントを変える
//値が負の値の時、赤のテキストで描画
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  value: string;
  dummy :Extended;
begin
  Value :=StringGrid1.Cells[ACol, ARow];
  if not TexttoFloat(PChar(Value), dummy, fvExtended) then
    //数値以外のセル
    StringGrid1.Canvas.Font.Color :=clBlack
  else begin
     if StrToFloat(Value) > 0 then //奇数行の背景色
       StringGrid1.Canvas.Font.Color :=clBlack
     else
       StringGrid1.Canvas.Font.Color :=clRed;
  end;
  
  DrawText(StringGrid1.Canvas.Handle,
           PChar(StringGrid1.Cells[ACol, ARow]),
           Length(StringGrid1.Cells[ACol, ARow]),
           Rect,
           DT_VCENTER or DT_SINGLELINE);
end;

//特定の列を削除
procedure DeleteCol(sg: TStringGrid; Index: Integer);
var
  i, j: Integer;
begin
  for j :=0 to sg.RowCount -1 do
    for i :=Index to sg.ColCount -2 do
      sg.Cells[i, j] := sg.Cells[i+1, j];

  sg.ColCount :=sg.ColCount -1;
end;

//特定の行を削除
procedure DeleteRow(sg: TStringGrid; Index: Integer);
var
  i, j: Integer;
begin
  for j :=Index to sg.RowCount -2 do
    for i :=0 to sg.ColCount -1 do
      sg.Cells[i, j] := sg.Cells[i, j+1];

  sg.RowCount :=sg.RowCount -1;
end;

//特定の位置に列を挿入
procedure InsertCol(sg: TStringGrid; Index: Integer);
var
  i, j: Integer;
begin
  sg.ColCount :=sg.ColCount +1;

  for j :=0 to sg.RowCount -1 do
    for i :=sg.ColCount-1 downto Index do
    begin
      if i = Index then
        sg.Cells[i, j] := ''
      else
        sg.Cells[i, j] :=sg.Cells[i-1, j];
    end;
end;

//特定の位置に行を挿入
procedure InsertRow(sg: TStringGrid; Index: Integer);
var
  i, j: Integer;
begin
  sg.RowCount :=sg.RowCount +1;

  for j :=sg.RowCount-1 downto Index do
    for i :=0 to sg.ColCount -1 do
    begin
      if j =Index then
        sg.Cells[i, j] :=''
      else
        sg.Cells[i, j] := sg.Cells[i, j-1];
    end;
end;

PRリンク ホームページ入門 tableタグ