如何使用按钮单击在绘图网格中绘制选定的单元格

时间:2013-06-18 19:12:17

标签: delphi delphi-xe2

在使用鼠标选择单元格并单击按钮后,如何在Delphi drawgrid单元格内绘制。按下按钮后要绘制的单元格。

1 个答案:

答案 0 :(得分:3)

将绘图信息存储在单独的容器中,例如与网格中的单元格具有相同项目数的数组,然后使用网格的OnDrawCell事件根据需要使用当前存储的信息绘制单元格在容器中。要更新图形,请根据需要更新容器的内容,然后Invalidate()网格以触发重新绘制,以便OnDrawCell事件使用新信息。

更新:例如:

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.