Highlight the current cell in a TStringGrid (Views: 30)
Problem/Question/Abstract: How to highlight the current cell in a TStringGrid Answer: You solve your problem by using a handler for the grids OnDrawCell event. There you draw both cell background and text when the cell is in the column or row of the selected cell. You also need a handler for OnSelectCell. Here you invalidate the row and column for the old selected cell (still indicated by the grids Col and Row property) and then you invalidate the row and column for the newly selected cell (indicated by the handlers aCol and arow parameters). The TStringGrid class inherits some protected methods from its ancestors which you need for this task. These are InvalidateRow and InvalidateCol. You get at them using a cracker class. type TGridCracker = class(TStringgrid); procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var grid: TStringGrid; begin grid := Sender as TStringGrid; if not (gdfixed in State) and ((grid.row = arow) or (grid.col = acol)) then begin with grid.canvas do begin brush.color := clYellow; if gdSelected in State then Font.color := clBlue else Font.color := clBlack; Fillrect(rect); TextRect(Rect, Rect.left + 2, rect.top + 2, grid.Cells[acol, arow]); end; end; end; procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin with TGridCracker(Sender as TStringGrid) do begin {redraw column and row if currently selected cell} Invalidaterow(row); Invalidatecol(col); {redraw column and row of new selected cell} Invalidaterow(arow); Invalidatecol(acol); end; end; |