You cannot do it with the standard events. But you can derive a new TStringGrid from the current class and override the DrawFocusRect method to paint nothing. Since this does not affect any properties you can even keep the class name:
type
TStringGrid = type(Grids.TStringGrid)
protected
procedure DrawFocusRect(aCol,aRow: Integer; ARect: TRect); override;
end;
...
procedure TStringGrid.DrawFocusRect(aCol, aRow: Integer; ARect: TRect);
begin
// Do nothing
end;
If you only have one string grid in your project you can add this code to the unit in which it is used. Or, if you have several grids, put it into its own unit and add this unit to the *end* of the uses clauses of all units with strings grids. Having the new unit at the end of the uses clause (or to be more precise: after the grids unit) makes it replace the standard TStringGrid.
[EDIT]
howardpc in the following post is right: it should be "class(Grids.TStringGrid)" instead of "type(Grids.TStringGrid)".