Olá galera, vamos a esta Quick Tip, onde vou mostrar como sublinha e mudar a cor de uma célula do DBGrid quando o mouse estiver sobre ela.
Vamos precisar do seguinte :

1 - DBGrid
1 - ClientDataSet
1 - DataSorce

Veja a imagem abaixo, o que importa não é a conexão e sim seu DBGrid com registro para podermos ver o exemplo funcionando.


Vamos criar uma classe no nosso formulário que herda de TDBGrid, para podermos acessar propriedades privadas da class TDBGrid, veja como criar.
type
  THackDBGrid = class(TDBGrid);
  TForm1 = class(TForm)

Com o layout montado vamos agora precisar de uma property para poder armazenar e mudar a posição do mouse. No private do próprio formulário faça o seguinte :

  private
      property MouseOverRow: integer;


Ao fazer isso, você irá apertar CTRL + SHIFT + C , para poder implementar o código completo, sem você ter trabalho. Em seguida seu código irá ficar assim :

  private
    FMouseOverRow: integer;
    procedure SetMouseOverRow(const Value: integer);
    { Private declarations }
    property MouseOverRow: integer read FMouseOverRow write SetMouseOverRow;
  public


Feito isso vamos agora implementar no método SetMouseOverRow, o seguinte:

procedure TForm1.SetMouseOverRow(const Value: integer);
begin
  FMouseOverRow := Value;
  DbGrid1.Repaint;
end;



Agora vamos aos efeitos do DBGrid, selecione o mesmo e em Events, localize o evento :

onDBGrid1DrawColumnCell e implemente o seguinte :

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if not ((gdFocused in State) or (gdSelected in state))
     and (MouseOverRow = 1 + THackDBGrid(TDBGrid(Sender)).DataLink.ActiveRecord) then
  begin
    TDBGrid(Sender).Canvas.Brush.Color := $00C1FFFF;
    TDBGrid(Sender).Canvas.Font.Color := clBlue;
    TDBGrid(Sender).Canvas.Font.Style := [fsUnderline];
  end;
  TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
end; 



onDBGrid1MouseMove e implemente o seguinte :

procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  pPosicao: TGridCoord;
begin
  pPosicao := TDBGrid(Sender).MouseCoord(x,y);
  MouseOverRow := pPosicao.Y;
end; 


Depois disso tudo pronto, veja o resultado :



Fico por aqui e até a próxima Quick Tip.

Um abraço
Wesley Y
www.lithic.com.br