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!


Bruto do Delphi
Bruto do Delphi

Apaixonado por Delphi. Mas sem frescura, sem modinhas, só o necessário pra ficar bem feito, funcionando rápido e o mais fácil possível de fazer.

    5 replies to "Dica do Bruto: Corrigindo problema no DBGrid em projetos migrados do Delphi 7"

    • 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

          • LUCAS MARQUES DE MOURA

            amigo uma dica , desabilite a propriedade defaultdrawing do dbgrid , porém ai voce terá de programar a cor quando o a linha estiver selecionada .

        • Eduardo Mendonça

Leave a Reply