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;
Apenas 4 detalhes na minha solução de grid zebrada horizontalmente:
- Nas opções do grid eu liguei a opção de seleção de linha inteira (RowSelect)
- Eu peguei o dataset ligado ao datasource ligado ao grid. Com isso não preciso me importar com trocas de componentes.
- Usei a função ODD que retorna true se o numero passado pra ela for impar.
- 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;
Mesmo código da anterior, só mudamos duas coisas:
- No teste do if, testamos DataCol, que é o índice da coluna.
- 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.