[Delphi] Dicas do componente DBGrid

Saudações, leitores! Há algum tempo, tive de implementar uma funcionalidade que exibe uma imagem na célula de uma coluna do componente DBGrid. Enquanto pesquisava na internet, encontrei vários exemplos, no entanto, muitos deles estavam incompletos. Por conta disso, decidi reunir não só essa, mas também outras dicas desse componente neste artigo. Confira!

O componente TDBGrid é utilizado em praticamente todas aplicações para exibir dados na tela. No artigo, apresentarei 10 dicas para incrementar as funcionalidades desse componente e trazer uma melhor usabilidade para o usuário.
Sem mais delongas, mãos à obra!

1) Imagem dentro de uma célula

Considere que, na coluna “Ativo” de uma DBGrid, seja necessário exibir um ícone para “Sim” e outro para “Não”.
Em primeiro lugar, é necessário utilizar um componente TImageList (paleta Win32) e adicionar 2 imagens, cada uma representando um estado da coluna “Ativo”, conforme ilustrado abaixo:

Imagens no ImageList

Em seguida, basta implementar o seguinte código no evento OnDrawColumnCell da DBGrid:

2) Checkbox dentro de uma célula

Essa dica é bem semelhante ao código acima, salvo algumas exceções. Não precisamos do TImageList neste caso, portanto, somente o código abaixo é necessário para desenhar o CheckBox:

Porém, se você executar este código, irá observar que, quando clicamos na célula, ao invés de marcar ou desmarcar o CheckBox, aparecerá a letra “S” ou “N”. Para evitar isso, são 2 passos. Primeiro, vamos manter a coluna “Ativo” como somente leitura, adicionando o código abaixo no evento OnColEnter da DBGrid:

Em seguida, precisamos “esconder” os valores “S” e “N” na célula através do evento OnGetText do campo (Field) “Ativo” no DataSet:

Por útimo, claro, é necessário alterar os valores quando o usuário clicar no CheckBox. Para isso, implemente o seguinte código no evento OnCellClick da DBGrid:

3) ComboBox dentro de uma célula

Para disponibilizar múltiplas opções para o usuário em forma de ComboBox, trabalharemos com a propriedade PickList da classe TColumn. No evento OnCreate ou OnShow do formulário, preencha essa propriedade com as opções que devem ser exibidas na coluna. No exemplo abaixo, ao clicar na coluna “Cidade”, a DBGrid apresenta as alternativas adicionadas:

Legal, porém, há um problema: o ComboBox só é exibido quando clicamos duas vezes na coluna, prejudicando a usabilidade. Como alternativa, utilize o evento OnColEnter da DBGrid e habilite a propriedade EditorMode para essa coluna:

Faça o mesmo para o evento OnCellClick para permitir a exibição do ComboBox ao alterar de linha:

4) Ordenar os registros ao clicar no título da coluna

Essa dica é uma boa, hein? E melhor, é fácil!
Para essa funcionalidade, devemos utilizar o evento OnTitleClick da DBGrid, inserindo o código a seguir:

Observe que, ao clicar na título das colunas, uma linha vertical aparece temporariamente na DBGrid. Isso ocorre em função da propriedade Options > dgColumnResize, que permite o redimensionamento das colunas com o mouse. Caso essa função não seja conveniente, desative-a para evitar esse efeito.

5) Alterar a fonte das linhas

Algumas vezes, é necessário formatar a fonte de algumas linhas para destacar o estado do registro. Utilizando o mesmo exemplo da coluna “Ativo”, suponha que os registros que estiverem inativos (“N”) devem ser marcados em vermelho e itálico. Essa funcionalidade também deve ser adicionada no evento OnDrawColumnCell:

6) Linhas zebradas

Aproveitando a dica anterior, confira também como deixar a DBGrid “zebrada” no evento OnDrawColumnCell, ou seja, alternar as cores de cada registro para aprimorar a visibilidade.

7) Mover a posição da linha junto com a barra de rolagem

Quando o usuário move a barra de rolagem vertical na DBGrid, já notou que posição do registro não acompanha essa movimentação? Procurei alguma explicação na documentação do Delphi, mas não obtive sucesso. Mesmo assim, há uma forma de contornar esse comportamento, embora seja um pouco complexo. Primeiramente, é preciso herdar um componente da classe TDBGrid para que possamos declarar o método que responde à mensagem de Scroll:

Em seguida, implementamos a função com o código abaixo:

Agora, execute a aplicação, mova a barra de rolagem vertical e observe que a posição do DataSet acompanha automaticamente a movimentação  da barra.

8) Obrigar letras maiúsculas nas células

Como as células da DBGrid não possuem a propriedade CharCase para configurar a digitação em maiúsculas, podemos implementar esse comportamento no evento OnKeyPress:

9) Exibir “Sim” para o valor “S” e “Não” para o valor “N”

Se a intenção é converter os valores “S” e “N” para “Sim” e “Não”, respectivamente, basta utilizar o evento OnGetText do campo (Field) do DataSet. No exemplo abaixo, faço essa conversão com uma coluna que armazena estes valores:

10) Navegar entre as células com as teclas de seta, mantendo o efeito de linha selecionada (dgRowSelect)

Quando ativamos a propriedade dgRowSelect, a DBGrid impede a navegação entre as células com as teclas de seta. Lembro-me que um dos usuários da minha aplicação reportou uma queixa desse comportamento. Para solucioná-lo, deasativei a opção dgRowSelect da propriedade Options da DBGrid e implementei o código abaixo no evento OnDrawColumnCell:

Pessoal, e agora vem a melhor parte: desenvolvi um pequeno exemplo com todas as dicas mencionadas acima! Baixe-o neste link.

Um grande abraço a todos!


André Celestino