Resolução do Desafio do Canvas no Grid

E ai brutos? Quebrando tudo com as dicas que eu dei no post anterior? Tomara que sim. Estou passando por aqui rapidinho só pra postar a resolução dos dois desafios que eu deixei no meu último post. Não leu o post anterior? Clica aqui, vai lá, lê e tenta fazer. Se não conseguiu fazer, levante, encha os pulmões e grite 3 vezes bem alto pra todo mundo na firma ouvir: “Eu sou fraquinho!”. Depois disso volte aqui e veja a minha solução.

Se você foi bruto o suficiente pra fazer e conseguiu chegar no resultado que eu queria (uma grid zebrada horizontalmente, e outra verticalmente), mas seu código tá diferente do meu, não liga não. Programação é igual sexo: não há nada errado e nem nada que seja 100% certo, desde todos cheguem nos resultados desejados.  (Seguindo essa mesma lógica, programar em Java é a mesma coisa que ser estuprado por um homem bem-dotado). Mas bem, vamos ao que interessa, a resolução.

Grid zebrada horizontalmente

var Cor, CorNormal,CorSelecionada: TColor;
begin
  CorNormal := clSkyBlue;
  CorSelecionada := clRed;
  if Odd(DBGrid1.DataSource.DataSet.RecNo)  then
  begin
    if (gdSelected in State) or (gdRowSelected in State)  then
      Cor := CorSelecionada
    else
      Cor := CorNormal;
    DBGrid1.Canvas.Brush.Color := Cor;
    DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
  end;
end;

Figura1

Apenas 4 detalhes na minha solução de grid zebrada horizontalmente:

  1. Nas opções do grid eu liguei a opção de seleção de linha inteira (RowSelect)
  2. Eu peguei o dataset ligado ao datasource ligado ao grid. Com isso não preciso me importar com trocas de componentes.
  3. Usei a função ODD que retorna true se o numero passado pra ela for impar.
  4. Eu coloquei uma cor diferente quando a linha ou célula estiver selecionada.

Grid zebrada verticalmente

var Cor, CorNormal,CorSelecionada: TColor;
begin
  CorNormal := clSkyBlue;
  CorSelecionada := clWebLightBlue;
  if Odd(DataCol)  then
  begin
    if (gdSelected in State) or (gdRowSelected in State)  then
      Cor := CorSelecionada
    else
      Cor := CorNormal;
    DBGrid1.Canvas.Brush.Color := Cor;
    DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
  end;
end;

Figura2

Mesmo código da anterior, só mudamos duas coisas:

  1. No teste do if, testamos DataCol, que é o índice da coluna.
  2. A cor selecionada escolhi outra.

Bem brutos, é a solução é simplesmente essa. Com um pouco mais de esforço você consegue adaptá-la para ser um código universal, para ser usado em todas as suas grids sem nenhuma alteração. Vou ficando por aqui. Coice do bruto.

 

Comentários

  1. Olá. Quero inserir uma pequena imagem no canto direito do título da coluna para demonstrar o tipo de ordenação do campo. Como proceder?

  2. bom dia! Como eu faço para pintar linha no TGrid do firemonkey assim como eu faço no DBGrid da VCL? Alguém já se deparou com esse problema?