Resolução do Desafio do Canvas no Grid

Tempo de leitura: 2 minutos

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.

 

  • Rodrigo Gama

    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?

  • Douglas Rabassi

    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?