Dica do Bruto: Corrigindo problema no DBGrid em projetos migrados do Delphi 7

Tempo de leitura: 2 minutos

Ae galera, bruto na área! Antes que você crie falsas esperanças, não, essa não é a parte 2 do nosso post sobre como turbinar o seu DBGrid. É mais um complemento rápido da parte um, mas vale a pena continuar lendo. Um dos companheiros do grupo Delphi Bruto do Whatsapp,  (ainda não está no grupo? Está perdendo tempo seu lerdo! Manda um e-mail AGORA com seu telefone e nome para alan@rmfactory.com.br) me pediu ajuda dizendo que portou o código dele do saudoso Delphi 7 (esse era bruto) para uma versão mais nova e em todo lugar que ele alterou a cor da fonte de um DBGrid, quando a linha era selecionada, ficava estranho, mal desenhado. Segue uma imagem para vocês entenderem o problema dele:

selecao1

O código que gera esse problema é o seguinte (lembrando que você tem que selecionar a opção para selecionar a linha inteira no grid):

if Odd(DBGrid1.DataSource.DataSet.RecNo)  then
begin
  DBGrid1.Canvas.Font.Color := clRed;
  DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;

Bem, a solução para esse caso é simples. Segue print de como ficou:

selecao2

E o código que soluciona o problema:

var tmpRect: TRect;
begin
  if Odd(DBGrid1.DataSource.DataSet.RecNo)  then
  begin
    DBGrid1.Canvas.Font.Color := clRed;
    tmpRect := Rect;
    tmpRect.Left := tmpRect.Left + 1;
    DBGrid1.DefaultDrawColumnCell(tmpRect,DataCol,Column,State);
  end;

A magica ai é simples, desenhar tudo um pixel para frente. Se você prestar bem atenção na imagem com o problema pode ver que o grid por si só já escreve em preto o que você quer reescrever em vermelho antes que você possa fazer qualquer coisa. Lembra do primeiro post, o esquema sobre o DefaultDrawing?. Nesse momento a função DefaultDrawColumnCell reescreve o seu texto em vermelho, obedecendo os parâmetros que você passar. Mas por algum motivo (tenho minhas teorias, mas nada confirmado) quando é seleção o parâmetro Rect vem com um pixel para trás e ao escrever ele acaba dando aquele efeito indesejado de sombra preta. Nesse código copiamos o rect para uma variável temporária, já que ele é um parâmetro “const” eu não posso alterá-lo, e incrementamos 1 no left. Bem alguns mais curiosos devem estar se remoendo por dentro de curiosidade: “Mas porque não acontecia no Delphi 7?” O Delphi 7 desenha o grid de forma “crua”. Ficava com aquela cara de Windows 95:

selecao3

Já os Delphi novos, não me pergunte a partir de qual que eu não sei,  nos presentearam com a propriedade DrawingStyle, que controla como o grid vai ser desenhado:

selecao4

  • gdsThemed – De acordo com o tema escolhido para a aplicação (1º e 2º grids)
  • gdsClassic – Visual Antigo (3º grid)
  • gdsGradient – Gradiente, utilizando as cores selecionadas na propriedade GradientStartColor e GradienteEndColor (4º Grid)

selecao5

E quando escolhemos as opções modernas, ele desenha com um pixel de diferença. Os projetos convertidos e novos tem como padrão a opção gdsThemed, enquanto no Delphi 7 só havia o tipo de desenho gdsClassic.

Bem, vamos ficando por aqui com essa dica (não tão) rápida para vocês.

Coice do bruto!

  • Eduardo Mendonça

    https://uploads.disquscdn.com/images/a40b434cb6e4cd4135a4df704f4626db4aadde9b72ce5eba02102a00caafbd5f.png No meu caso eu Coloquei eu tenho que por os registros da coluna alinhas em diferente posições (Left,Center ou Right) dependendo do registro e me apareceram dos problemas o primeiro é que ao redesenhar ele mantem no retângulo o registro na posição normal e outro na posição que preciso e o segundo é que ele entra em loop eterno redesenhado o grid eternamente.

    • Alan Victor Calsolari Bariani

      Bom dia amigo… me envie em particular, no brutodelphi@gmail.com o seu codigo de desenho para eu dar uma olhadinha..

      • Eduardo Mendonça

        envio sim. Eu estou tentando com o TDBgrid com a Properties DrawingStyle : gdsGradient

      • Eduardo Mendonça

        Descobriu?