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というコンポーネントのソースを参考にしました。
|