furathamaKos
furathamaKos

Reputation: 51

How to paint a selected cells in a drawgrid using a button click

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

Answers (1)

Remy Lebeau
Remy Lebeau

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

Related Questions