Reputation: 51
How do I paint inside a Delphi drawgrid cells after selecting the cells using mouse and by clicking on a button. Cells to be painted after pressing the button.
Upvotes: 2
Views: 7202
Reputation: 595422
Store drawing information in a separate container, such as an array with the same number of items as their are cells in the grid, then use the grid's OnDrawCell
event to paint the cells as needed using the information currently stored in the container. To update the drawing, simpy update the contents of the container as needed and then Invalidate()
the grid to trigger a repaint so the OnDrawCell
event uses the new information.
Update: For example:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids;
type
CellInfo = record
BkColor: TColor;
end;
TForm1 = class(TForm)
DrawGrid1: TDrawGrid;
Button1: TButton;
procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
Cells: array of CellInfo;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
Vcl.ExtCtrls;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
R: TGridRect;
Row, Col: Integer;
begin
R := DrawGrid1.Selection;
for Row := R.Top to r.Bottom do
begin
for Col := R.Left to R.Right do
begin
Cells[(Row * DrawGrid1.ColCount) + Col].BkColor := clBlue;
end;
end;
DrawGrid1.Invalidate;
end;
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
CellIndex: Integer;
begin
CellIndex := (ARow * DrawGrid1.ColCount) + ACol;
if gdFixed in State then
begin
DrawGrid1.Canvas.Brush.Color := DrawGrid1.FixedColor;
end
else if (State * [gdSelected, gdHotTrack]) <> [] then
begin
DrawGrid1.Canvas.Brush.Color := clHighlight;
end else
begin
DrawGrid1.Canvas.Brush.Color := Cells[CellIndex].BkColor;
end;
DrawGrid1.Canvas.FillRect(Rect);
if gdFixed in State then
Frame3D(DrawGrid1.Canvas, Rect, clHighlight, clBtnShadow, 1);
if gdFocused in State then
DrawGrid1.Canvas.DrawFocusRect(Rect);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
SetLength(Cells, DrawGrid1.RowCount * DrawGrid1.ColCount);
for I := Low(Cells) to High(Cells) do
begin
Cells[I].BkColor := DrawGrid1.Color;
end;
end;
end.
Upvotes: 4