Alterar a cor da linha (item, registro, ...) selecionada na DBGrid. Insisto que estou me referindo à linha que recebe o foco, isto é, o registro corrente (que é afetado pelo setfocus, scroll, clique do mouse, filtro, pesquisa e outros).
Em condições normais, ou seja, configuração padrão
do Windows (WindowsXP, no
meu caso), a cor de qualquer item selecionadoé definida pelo próprio
Windows (clHighlight = azul escuro). Por isso, se
quisermos alterar esta cor, temos que fazê-lo pelo Windows (no XP é moleza).
Porém, se alterarmos esta cor, todos os programas que rodam
sob o
Windows terão alteradas as cores dos itens selecionados, (inclusive
os
componentes do Delphi que tenham a propriedade "items"). O ideal,
então, é alterar somente no Delphi (na DBGrid).
O motivo para isso é que a cor que o Windows define para o item selecionado é
um azul muito escuro, que dependendo da cor da fonte que você escolheu
para as linhas da DBGrid, podem ficar de difícil leitura quando uma
linha
recebe o foco. Alterando essa cor (para uma mais clara, mais transparente,
como clAqua, no meu caso) é possível navegar perfeitamente pela
DBGrid com a
linha com foco destacada, mas de difícil (ou impossível) leitura.
Somente
por isso.
Você pode até deixar a propriedade Options.dgRowSelect = true
(para que a
seleção atinja a linha toda e não apenas a célula
que tenha o foco,
conforme podemos ver na figura abaixo:

Figura 1 - Exemplo de DBGrid
Observe que isso não altera outras condições impostas
para a apresentação da
DBGrid, como por exemplo, "zebrar" a DBGrid, usar Font.Color = clBlue
para
Crédito e clRed para Débito, ou como o exemplo acima, no qual
os
compromissos do ano corrente aparecem em Negrito e os compromissos do ano
seguinte aparecem em fonte Normal e clNavy, ou, naturalmente, de acordo com
os propósitos do seu código.
Como fazer?
No evento OnDrawColumnCell da DBGrid apenas acrescente um condição,
após o
seu código (se tiver):
procedure TF_Niver.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
//...
//seu código de formatação, para "zebrar" a DBGrid, por exemplo
if (gdSelected in State) then
DBGrid1.Canvas.Brush.Color := clAqua;
dbgrid1.DefaultDrawDataCell(Rect, Column.Field, State);
end;
Considerações
1- A condição (if) verifica se a linha da DBGrid
está selecionada, isto é, com foco. Se estiver (condição
=
true), a cor da linha será clAqua.
2- Se você quiser que a alteração de cor atinja a
linha
inteira, configure a propriedade options do DBGrid setando
o ítem dgRowSelect para true.
Se seu valor for false, apenas a célula com foco será destacada
com a cor que você escolheu (clAqua, no meu caso).
Espero ter ajudado!
Por: Carlos Roberto Moura
Contato: carlosrobertomoura@bol.com.br
|