DrawGrid/StringGridのDefaultDrawingを使わないDrawCellの使い方
12 DrawGridStringGridDrawCell-2 動作確認 Delphi2007 更新日 2007/12/04(火)

『DrawGrid/StringGridのDefaultDrawingを使ったDrawCellの使い方』の続きになります。

DefaultDrawing := True;だと
固定セルを描画してくれたり文字を描画してくれたり
してくれるのですが

実際には、固定セルではないのに固定セルにみせたり
固定セルなのに固定セルじゃなく見せたりする必要があったりしたいことも
なくはありません。

ということで、応用範囲が広い
元々の描画が無い状態 DefaultDrawing := False; で
DefaultDrawing := True;と同じ見え方になるようなコードを書きます。
────────────────────
procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGridInitialize;
  StringGrid1.DefaultDrawing := False;
end;


procedure TForm1.StringGridInitialize;
var
  i, j: Integer;
begin
  for i := 0 to StringGrid1.RowCount - 1 do
  begin
    for j := 0 to StringGrid1.Rows[i].Count - 1 do
    begin
      StringGrid1.Cells[j, i] := IntToStr(i)+'行'+IntToStr(j)+'列';
    end;
  end;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  PenBuffer: TPen;
  BrushBuffer: TBrush;
  FontBuffer: TFont;

  {↓FixedCellの枠を描画する}
  procedure DrawFixedFrame( ARect: TRect );
  begin
    if (Sender as TDrawGrid).Ctl3D then
    with (Sender as TDrawGrid) do
    begin
      Canvas.Pen.Style := psSolid;
      Canvas.Pen.Mode := pmCopy;
      with ARect do begin
        Canvas.Pen.Color := clBtnHighlight;
        Canvas.MoveTo( Right - 1, Top );
        Canvas.LineTo( Left, Top);
        Canvas.LineTo( Left, Bottom - 1 );
        Canvas.Pen.Color := clBtnShadow;
        Canvas.LineTo( Right - 1, Bottom - 1 );
        Canvas.LineTo( Right - 1, Top );
      end;
    end;
  end;

  {↓パラメータを一時保存}
  procedure BufferingOn;
  begin
    with Sender as TStringGrid do
    begin
      PenBuffer.Assign(Canvas.Pen);
      BrushBuffer.Assign(Canvas.Brush);
      FontBuffer.Assign(Canvas.Font);
    end;
  end;

  {↓パラメータを復帰}
  procedure BufferingOff;
  begin
    with Sender as TStringGrid do
    begin
      Canvas.Pen.Assign(PenBuffer);
      Canvas.Brush.Assign(BrushBuffer);
      Canvas.Font.Assign(FontBuffer);
    end;
  end;
  
begin
  PenBuffer := TPen.Create;
  BrushBuffer := TBrush.Create;
  FontBuffer := TFont.Create;
  BufferingOn;

  with Sender as TStringGrid do begin

  {↓固定セル}
  if gdFixed in State then
  begin
    Canvas.Brush.Color := FixedColor;
    Canvas.FillRect(Rect);
    {↑セル内を色で塗りつぶす}

    {↓文字描画}
    Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2,
      Cells[ACol, ARow]);

    DrawFixedFrame(Rect);
    {↑枠を描く}

  end else

  {↓セレクトセル}
  if gdSelected in State then
  begin
    {↓DrawFocusSelectedの場合はFocusedセルの色が違う}
    if (goDrawFocusSelected in Options)
      and (ACol = Col) and (ARow = Row) then
    begin
      {↓選択色}
      Canvas.Brush.Color := clHighlight;
      Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2,
        Cells[ACol, ARow]);
      Canvas.DrawFocusRect(Rect);
      {↑枠を描く}
    end else
    if (ACol = Col) and (ARow = Row) then
    begin
      {↓通常セル色}
      Canvas.Brush.Color := clWindow;
      Canvas.FillRect(Rect);
      Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2,
        Cells[ACol, ARow]);
      Canvas.DrawFocusRect(Rect);
      {↑枠を描く}
    end else
    begin
      Canvas.Brush.Color := clHighlight;
      {↓文字描画}
      Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2,
        Cells[ACol, ARow]);
      {枠描画処理は無し}
    end;

  end else

  {↓普通のセル}
  begin
    Canvas.Brush.Color := clWindow;
    Canvas.FillRect(Rect);

    {↓文字描画}
    Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2,
      Cells[ACol, ARow]);
  end;

  end;

  BufferingOff;
  PenBuffer.Free;
  BrushBuffer.Free;
  FontBuffer.Free;
end;
────────────────────
これが動作画面になります。


DefaultDrawing := True;の場合の
同じ画面と比較しています。上下で比較してください。
上がDrawCellを使ったもの、下が使わないDefaultDrawのもの。


StringGrid1.Options.goDrawFocusSelectedの変化にも対応しています。
StringGrid1.Options に [goDrawFocusSelected] が無い場合の
画面比較です。



GridのDrawCellを使いこなす時に利用してください。

参考────────────────────
DrawFixedFrameの部分は
TStrColGridというコンポーネントのソースを参考にしました。