delphitstringgrid

Setting background color of selected row on TStringGrid


I have a TStringGrid where the selected row (max 1, no multi-select) should always have a different background colo(u)r.

I set the DefaultDrawing property to false, and provide a method for the OnDrawCell event, shown below - but it is not working. I can't even describe exactly how it is not working; I supect that if I could I would already have solved the problem. Suffice it to say that instead of having complete rows all with the same background colour it is a mish-mash. Muliple rows have some cells of the "Selected" colour and not all cells of the cselected row have the selected colour.

Note that I compare the cell's row with the strnggrid's row; I can't check the cell state for selected since only cell of the selected row is selected.

procedure TForm1.DatabaseNamesStringGridDrawCell(Sender: TObject;
                                                 ACol, ARow: Integer;
                                                 Rect: TRect;
                                                 State: TGridDrawState);

  var cellText :String;
begin
   if gdFixed in State then
      DatabaseNamesStringGrid.Canvas.Brush.Color := clBtnFace
   else
   if ARow = DatabaseNamesStringGrid.Row then
      DatabaseNamesStringGrid.Canvas.Brush.Color := clAqua
   else
      DatabaseNamesStringGrid.Canvas.Brush.Color := clWhite;

   DatabaseNamesStringGrid.Canvas.FillRect(Rect);
   cellText := DatabaseNamesStringGrid.Cells[ACol, ARow];
   DatabaseNamesStringGrid.Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, cellText);
end;

Solution

  • if you are trying of paint the selected row or cell with a different color you must check for the gdSelected value in the state var.

    procedure TForm1.DatabaseNamesStringGridDrawCell(Sender: TObject;
                                                     ACol, ARow: Integer;
                                                     Rect: TRect;
                                                     State: TGridDrawState);
    var
      AGrid : TStringGrid;
    begin
       AGrid:=TStringGrid(Sender);
    
       if gdFixed in State then //if is fixed use the clBtnFace color
          AGrid.Canvas.Brush.Color := clBtnFace
       else
       if gdSelected in State then //if is selected use the clAqua color
          AGrid.Canvas.Brush.Color := clAqua
       else
          AGrid.Canvas.Brush.Color := clWindow;
    
       AGrid.Canvas.FillRect(Rect);
       AGrid.Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, AGrid.Cells[ACol, ARow]);
    end;