2015-09-06 64 views
-1

我在TStringGrid中有報告,並且需要按空格鍵時更改所選水平線單元格的bg顏色。在TStringGrid中使用空格鍵設置顏色選擇的行單元

如何能做到這一點

+3

記住行狀態(在某些集合),當用戶按下空格鍵,更新該狀態併爲網格調用「Invalidate」。最後,在OnDrawCell事件中,通過其狀態繪製行的單元格。 – TLama

+1

[設置TStringGrid上選定行的背景顏色](http://stackoverflow.com/q/5575713/62576)不幫你? –

回答

0
 TSelColor = class 
     public 
     Color: TColor; 
     constructor Create(const aColor: TColor); 
     end; 

     TForm1 = class(TForm) 
     StringGrid1: TStringGrid; 
     procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; 
      Rect: TRect; State: TGridDrawState); 
     procedure StringGrid1KeyDown(Sender: TObject; var Key: Word; 
      Shift: TShiftState); 
     private 
     { Private declarations } 
     public 
     kPressed: boolean; 
     end; 

    var 
     Form1: TForm1; 

    implementation 

    {$R *.dfm} 

    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; 
     Rect: TRect; State: TGridDrawState); 
    var 
     yourColor: TColor; 
    begin 
     yourColor:= clRed; 
     if gdFixed in State then 
     TStringGrid(Sender).Canvas.Brush.Color:= clBtnFace 
     else if gdSelected in State then 
     begin 
     TStringGrid(Sender).Canvas.Brush.Color:= clAqua; 
     if kPressed and not (TStringGrid(Sender).Objects[ACol, ARow] is TSelColor) then 
      TStringGrid(Sender).Objects[ACol, ARow]:= TSelColor.Create(yourColor) 
     else if kPressed and (TStringGrid(Sender).Objects[ACol, ARow] is TSelColor) then 
      TStringGrid(Sender).Objects[ACol, ARow]:= nil; 
     end 
     else 
     begin 
     TStringGrid(Sender).Canvas.Brush.Color:= clWindow; 
     if TStringGrid(Sender).Objects[ACol, ARow] is TSelColor then 
      TStringGrid(Sender).Canvas.Brush.Color:= TSelColor(TStringGrid(Sender).Objects[ACol, ARow]).Color; 
     end; 
     TStringGrid(Sender).Canvas.FillRect(Rect); 
     TStringGrid(Sender).Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, TStringGrid(Sender).Cells[ACol, ARow]); 
    end; 

    procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word; 
     Shift: TShiftState); 
    begin 
     if Key = 32 then 
     begin 
     kPressed:= true; 
     StringGrid1.Repaint; 
     kPressed:= false; 
     end; 
    end; 

    { TSelColor } 

    constructor TSelColor.Create(const aColor: TColor); 
    begin 
     inherited Create; 
     Color:= aColor; 
    end; 

StringGrid1
DefaultDrawning [虛假] Options.goRowSelect [真]

相關問題