2013-06-18 21 views

回答

3

將繪圖信息存儲在單獨的容器中,例如與網格中的單元格數量相同的項目數組,然後使用網格的OnDrawCell事件根據需要使用當前存儲在容器中的信息繪製單元格。爲了更新繪圖,simpy根據需要更新容器的內容,然後用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. 
+0

你是第一個發佈答案:-)嗯,這個容器應該最好作爲表單的索引屬性。因此,改變標誌的值將自動調用從設置者的無效 –

+0

如果可能我可以有一些代碼 – furathamaKos

+0

@furathamaKos:我更新了我的答案與一個例子。 –

相關問題