Obter a célula de um StringGrid que está sob o cursor do mouse no Delphi

Inclua na seção uses: Windows

{ Esta procedure pega a linha e coluna da célula onde estiver
  o mouse. Valores negativos para Linha ou Coluna indicam que
  o mouse está fora da área cliente do StringGrid }



procedure MouseCell(Grid: TStringGrid; 
  var Coluna, Linha: integer);
var
  Pt: TPoint;
begin
  GetCursorPos(Pt);
  Pt := Grid.ScreenToClient(Pt);
  if PtInRect(Grid.ClientRect, Pt) then
    Grid.MouseToCell(Pt.X, Pt.Y, Coluna, Linha)
  else begin
    Coluna := -1;
    Linha := -1;
  end;
end;

{ Exemplo de uso:
  - Coloque um botão no form;
  - Altere o evento OnClick deste botão como abaixo:
}

procedure TForm1.Button1Click(Sender: TObject);
var
  Coluna, Linha: integer;
begin
  MouseCell(StringGrid1, Coluna, Linha);
  if (Coluna >= 0) and (Linha >= 0) then
    Caption := 'Coluna: ' + IntToStr(Coluna) + ' - ' +
               'Linha: ' + IntToStr(Linha);
  else
    Caption := 'O mouse não está no StringGrid';
end;

{ Para testar: 
  - Execute o programa;
  - Posicione o cursor do mouse sobre alguma célula do 
    StringGrid;
  - Pressione TAB até chegar ao botão e pressione ENTER;
  - O resultado será mostrado no Caption do form;
}

Note que a procedure MouseCell usa um valor negativo (-1) para coluna e linha se o mouse não estiver sobre o StringGrid.