How to fill cell of a string grid using custom color?

后端 未结 2 1592
傲寒
傲寒 2020-12-10 23:27

I am trying to write custom date picker(calendar). The dates will be displayed on the stringgrid. I am trying to fill the clicked cell with a custom color and make that sele

2条回答
  •  时光说笑
    2020-12-11 00:10

    In the OnDrawCell procedure add just before FillRect

    Rect.Left := Rect.Left-4;
    

    Seems to work.


    An alternative

    The above doesn't fully solve the focus issue even with your paint procedure addon. Sometimes a white line is visible just inside the cell borders.

    But the following is an alternative, that solves both your issues. It requires a little more coding, but not so much. On the other hand, subclassing TStringGrid is not needed, neither the Rect adjustment

    The basis is to disable default drawing, so set the grids property DefaultDrawing := false; and then add to the OnDrawCell event:

    procedure TForm1.StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    begin
      if gdFixed in State then
      begin
        StringGrid.Canvas.Brush.Color := clGradientInactiveCaption;
        StringGrid.Canvas.Font.Style := [];
        StringGrid.Canvas.Font.Color := clBlack;
      end
      else
      if gdSelected in State then
      begin
        StringGrid.Canvas.Brush.Color := $00940A4B;
        StringGrid.Canvas.Font.Style := [fsBold];
        StringGrid.Canvas.Font.Color := clHighlightText;
      end
      else
      begin
        StringGrid.Canvas.Brush.Color := $00FFFFFF;
        StringGrid.Canvas.Font.Style := [];
        StringGrid.Canvas.Font.Color := clWindowText;
      end;
    
      StringGrid.Canvas.FillRect(Rect);
      StringGrid.Canvas.TextOut(Rect.Left + 3, Rect.Top + 5, StringGrid.Cells[ACol,ARow]);
    end;
    

    With default drawing disabled, the grid draws the grid frame and the grid lines, but leaves all other drawing to the programmer. The caveat is that you have to add fancy themed drawing yourself if you need it. With above coding I get this result:

提交回复
热议问题