Você está na página 1de 46

11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Diego Garcia
Delphi, Scrum, Arquitetura de Software
e um pouco mais…

Dicas sobre o componente DBGrid do Delphi


Publicado em 17/01/2013

O Dbgrid talvez seja um dos componentes mais utilizados no dia a dia de um desenvolvedor delphi,
principalmente em soluções comerciais, isso graças ao fato de que o uso deste componente seja definitivamente a
maneira mais simples e mais rápida de apresentar dados de um dataSet para o usuário, seja esse dataSet o
resultado de uma pesquisa em um banco de dados, registros temporários, etc. Na grande realidade o conceito de
grid está presente em qualquer ambiente de desenvolvimento.

Neste post eu resolvi juntar algumas dicas simples e práticas para melhorar a utilização deste componente. Para
melhor demonstrar os resultados dos exemplos, criei um projeto teste com dados fictícios em um ClienteDataSet,
porem, os exemplos que fiz são quase que 100% independentes do tipo de dataSet utilizado.

Fazer linha zebrada: vamos usar a lógica mais utilizada para zebrar linhas em um grid, verificar se o
numero do registro atual do dataSet é impar ou par, veja que não estou falando do valor de algum campo do
dataSet, mas sim o numero da linha dentro do dataSet. Para recuperar essa informação, nos dataSet temos a
propriedade RecNo que consiste no numero do registro ativo no dataSet e para saber se esse numero é impar
ou par, basta usar o método Odd que retornar true se um numero é impar e false se esse for par. Para
implementar essa rotina, iremos utilizar o evento OnDrawColumnCell do DbGrid que consiste no evento em
que os dados são “desenhados” no grid.

1 procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;


2 DataCol: Integer; Column: TColumn; State: TGridDrawState);
3 begin
4 with DBGrid1 do
5 begin
6 if Odd( DataSource.DataSet.RecNo) then
7 Canvas.Brush.Color := clSilver
8 else
9 Canvas.Brush.Color := clMoneyGreen;
10
11 Canvas.FillRect(Rect);
12 DefaultDrawColumnCell(Rect,DataCol,Column,State);
13 end;
14 end;

Note que para customizar a visualização do meu grid, eu utilizei a propriedade Canvas, é nesta propriedade que
ficam as configurações de tela do grid. Dentro da propriedade canvas, eu tenho a propriedade Brush, que é
utilizada para pintar o fundo de uma linha no grid. O resultado deste exemplo ficaria desta forma

Destacar linhas: Muitas vezes precisamos dar algum destaque visual para determinados registros
dependendo de alguma condição, para isso, podemos alterar dinamicamente a formatação de fonte ou até
mesmo
Privacidade a corEsse
e cookies: desite
fundo de uma
utiliza cookies. linha do
Ao continuar DBGrid.
a usar Seguindo
este site, você osseudados
concorda com uso. que criei para os exemplos faremos com
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies
que, os registros que tiverem um valor maior do que 2500 no campo salario fiquem com a linha vermelha
quando selecionados e os não selecionados fiquem com a fonte vermelha e em negrito. Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 1/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia
1 procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
2 DataCol: Integer; Column: TColumn; State: TGridDrawState);
3 begin
4 with DBGrid1 do
5 begin
6 if DataSource.DataSet.FieldByName('salario').AsFloat > 2500 then
7 begin
8 if (gdSelected in State) then
9 Canvas.Brush.Color := clRed
10 else
11 begin
12 Canvas.Font.Style := [fsBold];
13 Canvas.Font.Color := clRed;
14 end
15 end;
16 Canvas.FillRect(Rect);
17 DefaultDrawColumnCell(Rect,DataCol,Column,State);
18 end;
19 end;

Comparando com o exemplo anterior não temos muitas diferenças, a não ser pela verificação gdSelected in State,
caso esta verificação resulte em true significa que neste momento o DBGrid está desenhando a linha selecionada.
Neste o exemplo, o resultado ficaria desta forma

Destacar uma célula e uma coluna: Este exemplo, não chega a ser muito diferente do anterior, por isso,
mantive a mesma lógica, a coluna referente ao campo salario ficará com o fundo cinza, porem, caso algum
registro tenha uma valor neste campo maior do que 2500, a célula ficará com o fundo vermelho e a fonte
amarela.

1 procedure TfrmPrincipal.DBGrid1DrawColumnCell(Sender: TObject;


2 const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
3 begin
4 with DBGrid1 do
5 begin
6 if AnsiLowerCase(Column.FieldName) = 'salario' then
7 begin
8 Canvas.Brush.Color := clSilver;
9 if Column.Field.AsFloat > 2500 then
10 begin
11 Canvas.Brush.Color := clRed;
12 Canvas.Font.Color := clYellow;
13 end;
14 end;
15 Canvas.FillRect(Rect);
16 DefaultDrawColumnCell(Rect,DataCol,Column,State);
17 end;
18 end;

Talvez a diferença mais importante entre este exemplo e o anterior é a verificação feita pela coluna, ou seja, a
manipulação do canvas é feita somente quando a coluna salario está sendo desenhada. Rodando esse exemplo em
nossa base de estudo, teríamos o seguinte resultado

Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies

Inserir um checkbox em um coluna: Esse exemplo foi particularmente muito útil para mim Fechar
no meu dia a
e aceitar
dia, tanto que quando pensei em fazer esse post, foi o primeiro exemplo que separei para demonstrar. Ainda
https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 2/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

no evento OnDrawColumnCell, assim como no exemplo anterior, primeiramente precisamos saber se estamos
desenhando a coluna que recebera o checkBox para, ai sim, inserir o componente no grid.

1 procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;


2 DataCol: Integer; Column: TColumn; State: TGridDrawState);
3 const
4 IS_CHECK : Array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_
5 var
6 Check : Integer;
7 R : TRect;
8 begin
9 with DBGrid1 do
10 begin
11 if AnsiLowerCase(Column.FieldName) = 'selecionado' then
12 begin
13 Canvas.FillRect(Rect);
14 Check := IS_CHECK[Column.Field.AsBoolean];
15 R := Rect;
16 InflateRect(R,-2,-2); //aqui manipula o tamanho do checkBox
17 DrawFrameControl(Canvas.Handle,rect,DFC_BUTTON,Check)
18 end;
19 end;
20 end;

O código acima alem de inserir o checkBox no campo selecionado já define se este checkBox vai estar marcado ou
desmarcado, de acordo com o valor do campo em questão, através da variável Check, o resultado deste exemplo
ficaria desta forma

Para deixar um pouco mais prático o uso do checkBox no DBgrid, podemos fazer uma rotina para marcar ou
desmarcar o componente quando a célula que ele está seja clicada

1 procedure TForm1.DBGrid1CellClick(Column: TColumn);


2 begin
3 if Column.Field.FieldName = AnsiLowerCase('selecionado') then
4 begin
5 with DBGrid1.DataSource.DataSet do
6 begin
7 edit;
8 FieldByName('selecionado').Value := not FieldByName('selecionado').AsBoolean;
9 Post;
10 end;
11 end;
12 end;

Inserir uma imagem em uma coluna: Eu particularmente usei pouco esse recurso mas todas as vezes que
usei gostei bastante do resultado, a parte boa é que é bem simples de fazer. Como auxilio vamos utilizar um
componente TImageList para poder armazenar as imagens que iremos utilizar. Trabalhando com a ideia do
campo selecionado, vamos inserir duas imagens no TImageList e já deixar com que a imagem referente ao
valor False do campo fique com o índice zero enquanto que a referente ao valor True fique com o índice 1

Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies

Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 3/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Agora basta desenhar as imagens no DBGrid de acordo com a coluna e o valor da coluna.

1 procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;


2 DataCol: Integer; Column: TColumn; State: TGridDrawState);
3 begin
4 with DBGrid1 do
5 begin
6 if AnsiLowerCase(Column.FieldName) = 'selecionado' then
7 begin
8 Canvas.FillRect(Rect);
9 ImageList1.Draw(Canvas,Rect.Left+10,Rect.Top+1,Ord(Column.Field.AsBoolean));
10 end;
11 end;
12 end;

Simples não? Até mais simples do que o checkBox, apesar de nem sempre deixar o visual mais profissional.

Utilizar um ComboBox em uma coluna: A técnica de utilizar um ComboBox em um grid é feita de uma
forma um pouco diferente dos exemplos anteriores, dentro das Columns do Dbgrid existe a propriedade
PickList que consiste em um objeto do tipo TStrings e é utilizado exatamente para dar esse efeito do combo
dentro de uma célula do grid. Então para demonstrar a utilização desta propriedade, dentro do meu método de
carregar os dados, eu coloquei o seguinte trecho de código:

1 with Dbgrid1.Columns[2].PickList do //coluna referente ao cargo


2 begin
3 Clear;
4 Add('GERENTE');
5 Add('REPRESENTANTE');
6 Add('ENCANADOR');
7 Add('VENDEDOR');
8 end;

Obviamente este é apenas um exemplo didático, em uma situação real poderíamos carregar esta propriedade com
valores vindos de uma tabela de validação por exemplo. O código acima daria o seguinte efeito:

Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies

Ordenar dinamicamente pela coluna clicada pelo usuário: Por experiencia eu digo que a ordenação
Fechar e aceitar
dos dados em um DBgrid é uma das coisas mais importantes na hora de apresentar dados para um usuário,

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 4/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

mas é normal surgir a pergunta, como saber por qual campo ordenar os dados? Simples, permita que o
usuário escolha por qual campo ele quer fazer a ordenação. Pode parecer que não, mas é algo simples, neste
exemplo faremos com que quando o usuário clique no titulo de uma coluna no DBgrid, este seja ordenado pelo
campo desta coluna. Para deixar mais intuitivo para o usuário, vamos mudar o icone do mouse quando este
estivar passando pelo titulo dos campos no DBGrid, através do método OnMouseMove

1 procedure TForm1.DBGrid1MouseMove(Sender: TObject;


2 Shift: TShiftState; X, Y: Integer);
3 var
4 mousePt: TGridcoord;
5 begin
6 mousePt := DbGrid1.MouseCoord(x,y);
7 if mousePt.y = 0 then
8 Screen.Cursor := crHandPoint
9 else
10 Screen.Cursor := crDefault;
11 end;

Esse método MouseCoord do DBgrid, retorna dentro um record de TGridcoord, em qual linha (Y) e em qual
coluna (X) do grid o cursor do mouse está, por exemplo se você estiver com o cursor do mouse na segunda linha e
terceira coluna, teríamos os seguintes valores no TGridcoord.Y e TGridcoord.X

1 Y = 2;
2 X = 3;

Agora vamos efetivamente fazer a ordenação dos dados. Para deixar um pouco mais visual, vamos também deixar
em negrito o titulo da coluna em que o DBgrid está ordenado. A ordenação dos dados com clientDataSet fica fácil
graças a propriedade IndexFieldNames que define por quais campos o clientDataSet será indexado. Sendo assim
no método OnTitleClick, basta colocar o seguinte código:

1 procedure TForm1.DBGrid1TitleClick(Column: TColumn);


2 var
3 I: Integer;
4 begin
5 for I := 0 to DBGrid1.Columns.Count - 1 do
6 DBGrid1.Columns[i].Title.Font.Style := [];
7 TClientDataSet(DBGrid1.DataSource.DataSet).IndexFieldNames := Column.FieldName;
8 Column.Title.Font.Style := [fsBold];
9 end;

Seguindo este exemplo, ao clicar no titulo da coluna nome o resultado seria este

Talvez este seja o único exemplo que faça com as dicas deste post não sejam 100% compatíveis com qualquer
dataSet, pois utilizamos um método próprio de ClientDataSets, porem isso não significa que não seja possível
fazer este exemplo com outros tipos de dataSets, basta fazer uma ou outra adaptação.

Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies

Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 5/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia
Anúncios

Report this ad Report this ad

Compartilhe isso:

 Twitter  Facebook  Google  LinkedIn  E-mail

Carregando...

Relacionado

Criando um serviço do windows no Delphi Tipos Enumerados em Delphi Threads no Delphi, por onde começar ? –
Em "Programação" Em "Programação" Parte IV
Em "Programação"

Sobre Diego Garcia


Analista/Desenvolvedor Delphi desde 2008, bacharel em Ciência da Computação e entusiasta de metodologias ágeis e
engenharia de software.
Ver todas as mensagens por Diego Garcia →

Esse post foi publicado em Programação e marcado Delphi. Guardar link permanente.

194 respostas para Dicas sobre o componente DBGrid do Delphi

pedssm disse:
19/02/2013 às 11:06 pm

Olá Diego! Achei muito produtivo seu post! Queria aproveitar e tirar uma dúvida, vê se consegue me ajudar:
Tenho um DBGRID com várias colunas, e algumas delas mostram somente iniciais de palavras, conforme gravado no BD, por
exemplo, ‘A’ para ‘Aberto’. Queria saber como mostrar ao invés de ‘A’ (que ele carrega do dataset) seu Alias completo
(‘Aberto’ como dito em pauta). Como faço isso?
Responder

Diego Garcia disse:


19/02/2013 às 11:32 pm

Opa amigo como vai? antes de mais nada, muito obrigado pelo feedback, fico feliz que tenha gostado… Bom sobre
sua duvida, você pode usar o evento OnGetText do Field que você quer manipular. Pra fazer isso, selecione na
lista de campos do seu dataSet o campo que está vindo o identificador (o ‘A’ em questão), ai implemente o evento
OnGetText dele com algo desse tipo:
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
1 como
Para saber mais, inclusive sobre procedure
controlar osdmNucleo.cdsTesteIdentificadorGetText(Sender:
cookies, consulte aqui: Política de cookies TField;
2 var Text: string; DisplayText: Boolean);
3 begin Fechar e aceitar
4 Text := Sender.AsString;
5 if Sender.AsString = 'A' then
https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 6/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia
6 Text := 'Aberto'
7 else if Sender.AsString = 'F' then
8 Text := 'Fechado';
9 end;

Acho que isso ajuda =) abs.


Responder

pedssm disse:
20/02/2013 às 10:02 pm

Olá, eu novamente. Desde já agradeço a resposta.


Implementei da forma que indicou, ele altera a field como eu queria, mas o RadioGroup linkado na Query acho que não
identifica as letras ‘A’,’F’, para selecionar os Itens correspondentes às Values dele. Não sei se me compreendeu…
Responder

Diego Garcia disse:


20/02/2013 às 10:24 pm

Sim, acho que eu entendi sim amigo, tenta fazer o seguinte, no seu DBRadioGroup coloca tanto o Itens como o
Values com o valor que será apresentado no DBGrid, no caso ‘Aberto’, ‘Fechado’. Sim eu também acho estranho,
mas fiz um teste aqui rapidamente e funcionou. Qualquer coisa é só falar, estamos ai =).
Responder

pedssm disse:
20/02/2013 às 10:47 pm

Também não funcionou, pois no banco eu gravo as letras(Char), se colocar as palavras não funciona.Queria
que aparecesse na Field do DBGrid como se fosse um Alias da letra que realmente esta no banco.

Diego Garcia disse:


20/02/2013 às 11:15 pm

Que estranho, acho que funcionou no meu teste porque o meu dataSet estava esperando um campo com
somente um carácter, ai quando caia a palavra ‘Aberto’ por exemplo, ele só pegava a letra ‘A’. Para você
entender como testei, fiz um ClientDataSet com um campo do tipo ftString com size 1, no OnGetText deste
campo eu coloquei o código que eu lhe enviei no primeiro comentário, depois coloquei um dbGrid e um
DbRadioGroup. No dbRadioGroup coloquei o Itens e o Values como:
Aberto
Fechado
Ai sempre que eu mudava no DbRadioGroup eu dava um Edit e depois um Post no ClientDataSet. Para ter
certeza que ele gravou o que eu queria eu dava um ShowMessage no campo, ai só vinha a primeira letra
mesmo. Mas testei novamente com um size de 10 no campo e realmente ele está gravando a palavra
inteira. Para “contornar” esse problema você pode no OnSetText do campo fazer o processo contrário:

1 procedure dmNucleo.cdsTesteIdentificadorSetText(Sender: TField;


2 const Text: string);
3 begin
4 if AnsiUpperCase(Text) = 'ABERTO' then
5 Sender.Value := 'A'
6 else
7 Sender.Value := 'F';
8 end;

Sim é uma gambiarra, mas acho que ajuda. Eu realmente nunca gostei de usar o DbRadioGroup,
exatamente por problemas como esse. Me diga se funcionou, caso não tenha funcionado vamos atrás da
solução!
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
abs.controlar os cookies, consulte aqui: Política de cookies
Para saber mais, inclusive sobre como

Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 7/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Diego Garcia disse:


20/02/2013 às 11:56 pm

Pensando bem, você poderia usar um campo calculado, ai no DbGrid você apresenta o campo calculado, mas o
dbRadioGroup você aponta para o campo original. O campo calculado faria o mesmo trabalho do OnGetText, caso o
campo original tivesse com o valor ‘A’ o valor do campo calculado seria ‘Aberto’, caso fosse ‘F’, seria ‘Fechado’ etc… Acho
que essa seria uma solução ainda melhor do que o OnGetText / OnSetText.
Responder

Heleno disse:
12/09/2014 às 4:38 pm

Também estou com uma dúvida referente ao amigo e gostaria de saber qual seria o código para esse campo calculado
e em qual evento?
Responder

André disse:
20/03/2013 às 11:01 am

Olá, eu estou com uma duvida diferente, tenho um dbgrid e estou tentando implementar uma forma de redimencionar as
colunas quando levamos o cursor entre o titulo de uma coluna e outra quando o cursos se transforma em um crHSplit aí
damos um duplo cick e ela redimenciona automaticamente, mas não to conseguindo
Responder

Diego Garcia disse:


20/03/2013 às 11:26 am

Opa André, tudo bom? acho que não existe uma forma já pronta no componente para fazer isso, você teria que
pesquisar como redimensionar dinamicamente as colunas de um dbGrid e adaptar a solução ao seu cenário. Caso
eu descubra algo, volto aqui e posto. []’s
Responder

Diego disse:
09/09/2013 às 11:32 am

Estou tentando fazer a mesma coisa, alguém conseguiu fazer?


Responder

Fausto Santonello de Alencar disse:


07/04/2013 às 2:19 pm

Olá Diego, bom ter pessoas como voce, na net, tenho uma necessidade e não sei como resolvê-la,
Imagine uma nota fiscal, onde preciso inserir vários itens no corpo da nota. Preciso de um DBGrid e gostaria de Inserir,
Alterar e Excluir dados no Dbgrid, voce tem alguma publicação sobre este tema?
Responder

Diego Garcia disse:


07/04/2013 às 7:07 pm

Olá Fausto, muito obrigado pelo feedback. Sobre o seu problema, não cheguei a escrever nada sobre isso, mas se
entendi bem a sua necessidade você precisa editar dados diretamente no DBGrid certo? se for assim, acho que as
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
configurações default do DBGrid mais um DataSet editável já resolvem, mas acho que seria mais elegante você
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies
criar todo um processo de entrada de nota fiscal, onde os dados seriam inseridos em um dataSet temporário (um
ClientDataSet funciona perfeitamente para esse fim também) e neste cenário você teria um DBGridFechar
ligadoe aaceitar
esse

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 8/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

dataSet temporário apresentando os dados para o usuário. Depois bastaria efetivar esse dados no banco de dados.
Seria mais ou menos isso amigo?
Responder

Fausto Santonello de Alencar disse:


12/04/2013 às 7:18 am

Bom dia, Diego, é isso mesmo que preciso. Ja tenho o ClientDataSet no Data Module, só que não sei como
inserir os dados dentro do Dbgrid, para depois concretizar a gravação dos dados na nota fiscal.

Diego Garcia disse:


12/04/2013 às 10:08 am

Então Fausto, não sei se peguei em que ponto vc parou mas vamos la, para vc ligar qualquer DataSet a um
DBGrid, você deve usar um DataSource. O DataSource te a propriedade DataSet aonde vc teria que
apontar para o ClientDataSet e o DBGrid tem a propriedade DataSource que vc deve apontar para esse
novo DataSource. Por padrão o DBGrid já vem configurado para permitir edição diretamente nele, basta
você depois dar um .Edit .Post no seu ClientDataSet que os dados das alterações feitas no DBGrid já
estarão no ClientDataSet
algo mais ou menos assim:

1 if not (ClientDataSet1.State in [dsEdit, dsInsert]) then


2 ClientDataSet1.Edit;
3 ClientDataSet1.Post;

Uma outra dica é você usar o componente DBNavigator ligado ao dataSource, com ele você consegue
editar, inserir, excluir e navegar nos registros do DBGrid e ele é bem visual.
Com os dados efetivados no ClientDataSet basta você gravar no banco de dados, mas isso depende
diretamente da forma como voCê está se comunicando com o banco de dados. Se o clientDataSet estiver
ligado a um DataSetProvider e este ligado a um SqlTable, basta usar o ApplyUpdates do ClientDataSet, ou
você pode usar querys, ou componetes Table, essa etapa é realmente muito relativa. Qualquer duvida pode
entrar em contato…

[]’s

emanuel1 disse:
08/04/2013 às 9:29 am

Bom dia Diego. Como faço pra mandar um campo de um grid para outro grid. Porque quero que ao selecionar uma linha do
grid (PEDIDO), mande para outro grid os produtos daquela PEDIDO.
Responder

Diego Garcia disse:


08/04/2013 às 9:15 pm

Opa Emanuel, acho que seu caso é fazer esquema de mestre x detalhe, provavelmente isso lhe ajuda.
Responder

Paula disse:
24/04/2013 às 8:27 pm

Oi Diego,
Privacidade e cookies:
Estou comEsse
umsite utiliza cookies.
problema em Ao continuar
uma grid. aTenho
usar esteuma
site, você concorda
coluna data,com
noseubanco
uso. está salvo a data e a hora (dd/mm/yyyy hh:mm:ss).
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies
Mas na grid exibe apenas a hora e fora de ordem. Você sabe se alguma propriedade da grid pode estar fazendo isto?
Obrigada. Fechar e aceitar
Responder

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 9/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Diego Garcia disse:


25/04/2013 às 11:22 am

Olá Paula.. Acredito que se for no grid o problema, será na coluna que você está utilizando para mostrar a data,
porem, acredito que o problema se no field do seu dataSet.
Responder

Leoncio disse:
25/04/2013 às 4:33 pm

Boa tarde Diego.


Será que voce pode me ajudar. Tenho a seguinte situação, tenho um Memo onde vou colocar um comando SQL, quando
clicar no botao Executar o sistema deve pegar esse comando e listas os dados em um Grid,
Oque voce me sugere???
Responder

Leoncio disse:
25/04/2013 às 4:35 pm

Esqueci de comentar, estou trabalhando com a tecnologia ADOConection, ADOQuery e Data Source
Responder

Diego Garcia disse:


25/04/2013 às 4:39 pm

Opa Leoncio tudo bom? simples, em seu botão executar faça algo desse tipo:

1 ADOQuery.SQL.Text := Memo1.Lines.Text;
2 ADOQuery.Open;

Acredito que o ADOQuery já esteja apontado para o DataSource, ai basta apontar esse DataSource em um DBGrid
que os dados irão aparecer neste. =)
Responder

Andre disse:
29/04/2013 às 3:07 pm

Era isso que eu estava procurando, um tuto que falasse de forma clara e completa sobre dbgrid
sou iniciante em delphi e achei muito boa sua publicação, parabéns pela iniciativa
Responder

Diego Garcia disse:


29/04/2013 às 3:12 pm

Opa Andre, muito obrigado, fico realmente muito feliz que o post esteja sendo útil. Grande abraço… se precisar de
algo é só falar.
Responder

lucashegomes disse:
Privacidade e cookies:àsEsse
29/04/2013 3:41site
pmutiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies

Caraca, seu post foi excelente, consegui entender os detalhes perfeitamente, uma pena que ainda sou um pouco leigo pra
Fechar e aceitar
compreender tudo a fundo. Estou pegando grid agora, e, querendo aprender a fazer conexão entre os CRUD e o bd. Só uma

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 10/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

dúvida, qual é a diferença entre o GRID comum e o DBGRID? Eu não posso utilizar somente o GRID para fazer a transação
com o bd?
Responder

Diego Garcia disse:


29/04/2013 às 3:46 pm

Muito obrigado Lucas, fico feliz que tenha ficado fácil de entender. Sobre a sua pergunta, basicamente com o
DBGrid você consegue conectar ao um DataSource que por sua vez consegue se conectar com um DataSet que
pode ser uma tabela, um ClientDataSet com dados temporários, etc… Para fazer as transações com o banco de
dados você não precisa de nenhum GRID, mas para apresentar em tela as informações para o usuário no formato
de um grid o melhor componente é o DBGrid mesmo na minha opinião.
Responder

Rosevaldo Silva disse:


13/05/2013 às 6:04 pm

Boa tarde Diego, reforço os elogios da galera, seu post está sendo bem proveitoso. Mas tenho a seguinte necessidade: quando
o usuário clica na coluna para orderar o grid por ela, perdemos a seleção atual, sempre indo para a primeira célula do grid,
como faço para que mesmo depois de uma nova ordenação a seleção continue no registro anterior, obedecendo linha e coluna
de antes?
Responder

Diego Garcia disse:


13/05/2013 às 6:56 pm

Opa Rosevaldo, muito obrigado pelo feedback, é muito bom saber que o post está sendo útil. Sobre a sua
necessidade, você pode usar um Bookmark:

1 var
2 _registro : TBookmark;
3 begin
4 _registro := DBGrid1.DataSource.DataSet.GetBookmark; //Pega o local do registro atu
5 try
6 //...
7 finally
8 DBGrid1.DataSource.DataSet.GotoBookmark(_registro); //Movimenta o ponteiro do Dat
9 DBGrid1.DataSource.DataSet.FreeBookmark(_registro); //Libera o bookmark da memóri
10 end;

Como você falou que precisa disso na rotina que ordena o Grid, você pode fazer desta forma:

1 procedure TForm1.DBGrid1TitleClick(Column: TColumn);


2 var
3 I: Integer;
4 _registro : TBookmark;
5 begin
6 _registro := DBGrid1.DataSource.DataSet.GetBookmark;
7 try
8 for I := 0 to DBGrid1.Columns.Count - 1 do
9 DBGrid1.Columns[i].Title.Font.Style := [];
10 TClientDataSet(DBGrid1.DataSource.DataSet).IndexFieldNames := Column.FieldName;
11 Column.Title.Font.Style := [fsBold];
12 DBGrid1.DataSource.DataSet.GotoBookmark(_registro);
13 finally
14 DBGrid1.DataSource.DataSet.FreeBookmark(_registro);
15 end;
16 end;

Espero que tenha ajudado, eu não cheguei a testar o código, mas acho que funciona tranquilo, de qualquer forma,
comente
Privacidade e cookies: Esse aqui
site utiliza se deu
cookies. certo oua usar
Ao continuar não,este
qualquer coisa agente
site, você concorda com seufaz
=) uso.funcionar
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies

[]’s Fechar e aceitar


Responder

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 11/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

fernando disse:
17/05/2013 às 1:41 am

Diego, interessante seu blog.


Gostaria de desenhar no canvas com textout e desconsiderar o que o dbgrid escreve, como fazer isso ?
Responder

Diego Garcia disse:


17/05/2013 às 9:04 pm

Opa Fernando, obrigado pelo feedback.


Sobre a sua pergunta, nunca fiz algo deste tipo, infelizmente acho que não vou conseguir lhe ajudar com isso.

[]’s
Responder

paulo disse:
17/05/2013 às 8:54 pm

boa noite sobre o checkbox na grid, fiz tudo certinho, mas quando seleciono uma linha na grid aparecer atrás do checkbox a
palavra true ou false.
Responder

Diego Garcia disse:


17/05/2013 às 9:01 pm

Opa Paulo, boa noite.


Tente fazer o seguinte no evento OnGetText do field que vai receber o checkBox:

1 procedure dmNucleo.cdsTesteIdentificadorGetText(Sender: TField;


2 var Text: string; DisplayText: Boolean);
3 begin
4 Text := EmptyStr;
5 end;

Com isso você está limpando o texto que será exibido no grid, como você vai usar um checkBox no lugar do valor
original mesmo, isso não trara problemas.

[]’s
Responder

paulo disse:
17/05/2013 às 9:08 pm

Diego muito obrigado funcionou perfeitamente, parabéns pelo site…

Diego Garcia disse:


17/05/2013 às 9:10 pm

Excelente noticia Paulo, fico feliz que tenha ajudado.


[]’s
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies

Odirlei Duffeck disse: Fechar e aceitar

20/05/2013 às 9:57 am

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 12/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Bom Dia Diego!

Assim, estou com problemas no combo dentro dbgrid, eu colocando os valores no PickList, só que esse combo nativo permite
que o usuário digite algo que não esteja na lista, sabe de alguma maneira que eu possa modificar esse combo ou bloquear a
digitação????

Obrigado
Responder

Diego Garcia disse:


20/05/2013 às 10:46 am

Opa Odirlei, então, sinceramente não sei, até tentei fazer um teste aqui mas foi sem sucesso, o que você pode fazer
é usar o evento OnBeforePost do seu DataSet para validar se o valor do campo é valido.

[]’s
Responder

Odirlei Duffeck disse:


20/05/2013 às 10:55 am

Obrigado, vou dar um jeito de validar isso…

Jonathan Lazzaro disse:


20/05/2013 às 11:17 am

Bom dia, Diego! Gostei muito do seu exemplo de como exibir checkboxes dentro do DBGrid, mas pelo que pude perceber só
funciona com campos que já são nativamente Boolean.
Como eu poderia fazer isso em um DBGrid apontado para um DataSet do MySQL, por exemplo, onde campos Boolean não
são suportados (eu uso um campo TINYINT com valores 0 ou 1)?

Aproveito para lhe parabenizar pelo excelente post e te agradeço desde já!
Responder

Diego Garcia disse:


20/05/2013 às 11:27 am

Opa Jonathan, bom dia. Muito obrigado pelos elogios. Sobre a sua pergunta, é muito fácil a adaptação, basta
alterar a linha Check := IS_CHECK[Column.Field.AsBoolean]; para algo como Check :=
IS_CHECK[Column.Field.AsInteger = 1];. Seguindo o exemplo do post:

1 procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;


2 DataCol: Integer; Column: TColumn; State: TGridDrawState);
3 const
4 IS_CHECK : Array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_
5 var
6 Check : Integer;
7 R : TRect;
8 begin
9 with DBGrid1 do
10 begin
11 if AnsiLowerCase(Column.FieldName) = 'selecionado' then
12 begin
13 Canvas.FillRect(Rect);
14 Check := IS_CHECK[Column.Field.AsInteger = 1];
15 R := Rect;
16 InflateRect(R,-2,-2); //aqui manipula o tamanho do checkBox
Privacidade e cookies: Esse17 DrawFrameControl(Canvas.Handle,rect,DFC_BUTTON,Check)
site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
18 como controlar
Para saber mais, inclusive sobre end;os cookies, consulte aqui: Política de cookies
19 end;
20 end;
Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 13/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

é claro, levando em consideração que o seu campo representa 1 para True e 0 para False. Espero que tenha
ajudado.

[]’s
Responder

Jonathan Lazzaro disse:


20/05/2013 às 11:39 am

Obrigado mais uma vez, Diego! O mundo precisa de mais pessoas como você, rsrs

Abraço!

Fernando disse:
17/03/2014 às 3:31 pm

Eu tive a mesma dificuldade do Jonathan, porem eu copiei e colei esse codigo acima só troquei o selecionado
pelo nome do campo que eu quero que é ‘PASSO’ , mas não mudou em nada minha Grid

Romullo Machado disse:


23/05/2013 às 11:06 am

Olá Diego, tudo bem?


Vamos ver se você pode me ajudar, tenho um DBGrid e preciso mostrar os dados de uma tabela nesse DBGrid assim que eu
abrir o Form. Sabe de uma maneira que eu possa fazer isso?

Obrigado.
Abraço!
Responder

Diego Garcia disse:


23/05/2013 às 11:13 am

Opa Romullo, tudo bom? amigo você já ligou a sua tabela em um DataSet? o primeiro passo seria você conectar
com o banco de dados, e isso vai depender muito do banco que você está usando e qual tecnologia você vai usar
para acessar esse banco de dados. Vamos imaginar que você está usando ADO, então primeiro você precisa fazer a
conexão com o banco através de um componente ADOConnection, depois você deverá atribuir a tabela a um
componente ADOTable ou ADOQuery, também depende da sua necessidade, depois você deve ligar o seu DataSet
(ADOTable ou ADOQuery) a um DataSource, através da propriedade DataSet deste ultimo e por ultimo ligar esse
DataSource ao seu DBGrid.

Ai para abrir a tabela assim que o form for apresentado, basta você programar no evento OnShow do form por
exemplo, algo como:

1 Self.DBGrid1.DataSource.DataSet.Open;

Fica complicado lhe explicar sem saber ao certo até aonde você foi, espero que tenha ajudado, caso contrário,
comente aqui ou me mande um e-mail que eu lhe ajudo.

[]’s
Responder

Romullo
Privacidade Machado
e cookies: Esse site utiliza disse:
cookies. Ao continuar a usar este site, você concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies
23/05/2013 às 1:34 pm

Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 14/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Diego, deu tudo certo aqui!


Obrigado pela ajuda!
E parabéns pelo site.
Responder

Diego Garcia disse:


23/05/2013 às 1:53 pm

Muito obrigado Romullo, fico feliz que tenha dado certo.


[]’s
Responder

Renato Paiva disse:


24/05/2013 às 3:04 pm

Meus parabéns pelas dicas! Gostaria de dar minha contribuição.


Acontece que eu tive um pouco de dificuldades pra implantar a ordenação em campos lookup.
Resolvi o problema da seguinte forma:

1 procedure TForm1.DBGrid1TitleClick(Column: TColumn);


2 var
3 I: Integer;
4 begin
5 for I := 0 to DBGrid1.Columns.Count - 1 do
6 DBGrid1.Columns[i].Title.Font.Style := [];
7 if(Column.Field.KeyFields = '') then
8 dm.tbl_movimentos.IndexFieldNames:=Column.FieldName
9 else
10 dm.tbl_movimentos.IndexFieldNames:=Column.Field.KeyFields;
11 Column.Title.Font.Style := [fsBold];
12 end;

Lembrando que minha conexão é com FireBird feita através de um Data Module com o componente TIBTable.
Espero ter ajudado.
Abraços. 8)
Responder

Diego Garcia disse:


24/05/2013 às 3:22 pm

Opa Renato, muito obrigado pelo elogio.


Com certeza a sua contribuição é muito bem vinda e já está enriquecendo muito o tópico.
Muito obrigado.

[]’s
Responder

Felipe disse:
03/06/2013 às 10:43 pm

Boa Noite, eu tenho um outro problema, fiz um filtro no dbgrid, apos esse filtro ele fica salvo no dbgrid, para voltar todos os
dados tenho que fechar e abrir o aplicativo, como faço esse procediemtno com um botão?
Responder

Diego
Privacidade e cookies: Esse Garcia
site utiliza disse:
cookies. Ao continuar a usar este site, você concorda com seu uso.
Para saber mais, inclusive sobre como
04/06/2013 controlar
às 10:33 am os cookies, consulte aqui: Política de cookies

Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 15/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Opa Felipe, tudo bom? você filtrou o DataSet? usou a propriedade Filter? se sim, quando não quiser mais o filtro,
basta setar a propriedade Filtered do DataSet para false, exemplo:

1 Dbgrid1.DataSource.DataSet.Filtered := false;

Responder

Felipe disse:
04/06/2013 às 10:49 am

Segue abaixo o codigo que estou utilizando, duas coisas que queria mudar nele, colocar o comando like para
que filtre qualquer parte do texto, e logo apos a filtragem quero criar um botão, para limpar o DBGrid e
reemostar tudo na tabela.

procedure TFRCliente.DBGrid1KeyPress(Sender: TObject; var Key: Char);


var
Pesquisa : String;

begin
if key = #13 then

begin
if InputQuery(‘Pesquisar por: ‘ + TDBGrid(Sender).Columns[TDBGrid(Sender).SelectedIndex].FieldName,
‘Digite o conteúdo a Pesquisar’, Pesquisa) then
begin
TDBGrid(Sender).DataSource.DataSet.Filter := ‘”‘ +
TDBGrid(Sender).Columns[TDBGrid(Sender).SelectedIndex].FieldName + ‘”‘ + ‘ = ‘ + QuotedStr(Pesquisa);
TDBGrid(Sender).DataSource.DataSet.Filtered := True;
end
else
TDBGrid(Sender).DataSource.DataSet.Filtered := False;
end;
end;

Diego Garcia disse:


04/06/2013 às 10:57 am

Então Felipe, sobre o like, você não vai conseguir usar com Filtro, terá que rodar uma Query ou usar Índice, essa escolha
vai depender principalmente do banco que você usa. Se você optar por usar índice no field, então você poderá usar o
método FindNearest, ele é como se fosse um link, mas não busca em qualquer parte do texto, ele funciona como se fosse
um like desta forma ‘Texto%’.

Sobre limpar o Dbgrid eu não entendi muito bem oque você quer fazer. Se for só tirar o filtro basta você fazer como fez no
código que você postou aqui, se você quer atualizar o conteúdo do DataSet, você usar o método Refreash ou fechar e abrir
o DataSet.
Responder

Felipe disse:
04/06/2013 às 11:13 am

Ok, a primeira questão eu uso firebird e para conexão, IBDatabase1, IBTransaction1,IBTable1, DataSource1, o que vc
me recomendaria?

A segunda questão eu tentei fazer isso de abrir e fechar e não deu certo.
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
procedure
Para saber mais, inclusive TFRCliente.Button1Click(Sender:
sobre como TObject);
controlar os cookies, consulte aqui: Política de cookies
begin
DataSource1.DataSet.Close; Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 16/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

DataSource1.DataSet.Open;
end;
Responder

Diego Garcia disse:


04/06/2013 às 11:19 am

Para fazer o Like, então eu lhe recomendo usar uma Query, ai vc consegue fazer da forma que você quer
(com a porcentagem nas duas pontas).

E sobre abrir e fechar, oq deu errado? não seria o caso você também tirar o filtro do DataSet se ele estiver
filtrado?

Felipe disse:
04/06/2013 às 11:25 am

Para limpar o filtro fiz assim e deu certo:


procedure TFRCliente.Button1Click(Sender: TObject);
begin
DataSource1.DataSet.Close;
DBGrid1.DataSource.DataSet.Filtered := False;
DataSource1.DataSet.Open;
end;

O outro vou tentar aqui, qualquer te chamo ai de novo….rsrssrsr

Muito obrigado mesmo, e esse seu tutorial ficou excelente. Parabéns.

Diego Garcia disse:


04/06/2013 às 11:29 am

Opa Felipe, muito obrigado, fico muito feliz que você tenha gostado. Qualquer coisa é só falar, se eu souber terei muito
prazer em ajudar..
[]’s
Responder

Fhelipe disse:
10/06/2013 às 8:15 am

O posto ficou muito bacana e útil, parabéns. Gostaria de tirar uma dúvida, em relação ao grid, queria inserir uma informação
nele e ao clicar no botão salvar, ele salva-se essas informações no banco de dados, sou leigo no assunto, você poderia me
ajudar?
Responder

Diego Garcia disse:


10/06/2013 às 9:49 am

Opa Fhelipe, blz? o obrigado pelo elogio e o feedback. Sobre a sua duvida, na grande verdade, você não inseri
linhas em um DBGrid, vamos dizer que o DBGrid nada mais é do que a representação visual de um DataSet, ou
seja, os dados que estão aparecendo no DBGrid, na verdade estão armazenados em um DataSet, sendo assim, você
deve concentrar as suas alterações em um DataSet.
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies
[]’s
Fechar e aceitar
Responder

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 17/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Fhelipe disse:
10/06/2013 às 10:02 am

Opa, beleza cara, Obrigado por responder.. Como sou leigo no assunto, você poderia me ajudar nessa
situação? como eu poderia fazer isso?

Fhelipe disse:
10/06/2013 às 10:12 am

No caso, especificando melhor o que eu quero fazer.. Atribuir valores em um DBGrid, digamos, Código,
Descrição, atribuir essas informações no grid, e no evento do botão salvar essas informações sejam salvas no
banco de dados..

Diego Garcia disse:


11/06/2013 às 5:35 pm

Fhelipe, desculpe pela demora… tem essa apostila que fiz a muito tempo atrás para servir de apoio em um curso de
Delphi/Lógica de Programação que ministrei:

https://drgarcia1986.wordpress.com/2011/10/12/apostila-delphi-e-logica-de-programacao-para-iniciantes/

A parte de banco de dados está bem fraquinha, mas sugiro você dar uma lida e tentar fazer os exercícios, acho que pode
lhe ajudar um pouco… Qualquer duvida pode entrar em contato.

[]’s
Responder

Fhelipe disse:
13/06/2013 às 5:32 pm

Obrigado Diego, mas já consegui resolver meu problema, haha, agradeço mesmo assim, abraço.
Responder

Sebastião José de Souza Neto disse:


11/06/2013 às 11:06 pm

Boa Noite Diego, Parabéns pelos posts, muito bom


Estou precisando mudar a cor (fundo) apenas do Título de algumas colunas de uma DBGrid logo que o Form Abrir, tipo no
onShow do form… Exemplo: imagine uma DBGrid com 5 colunas, aonde que preciso mudar a colocar da célula apenas das
colunas 4 e 5 logo qdo o formulário surgir (onshow)…

Abraços
Responder

Diego Garcia disse:


12/06/2013 às 10:38 am

Opa Sebastião, tudo bom? obrigado pelo feedback.


Sobre a sua pergunta, se entendi bem, você quer color o fundo da célula de titulo de uma coluna especifica certo?
eu fiz um teste aqui com o Delphi XE2 e nas colunas existe a estrutura Title e dentro desta tem a propriedade
Color, porem, tentei alterar de diversas maneiras mas não surtiu efeito, não sei dizer se em outras versões do
Privacidade e cookies: Esse site utiliza
delphi cookies.
isso seja Ao continuar
diferente, seavocê
usar este site, você
estiver com concorda
outracom seu uso.
versão, tente
um código como esse:
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies

1 DBGrid1.Columns[0].Title.Color := clRed; Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 18/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

[]’s
Responder

Fhelipe disse:
14/06/2013 às 9:31 am

Gostaria de fazer outra pergunta, estou com um problema em uma DBGrid que está ligada a um data source que por sua vez
está ligado à um ClientDataSet, queria saber se você saberia como limitar a quantidade de caracteres de uma célula de uma
DBGrid, por exemplo no campo Código da DBGrid só 2 caracteres, no campo Quantidade somente 6, e por assim vai..
Responder

Diego Garcia disse:


14/06/2013 às 5:56 pm

Opa tudo bom?


Você pode tentar usar o evento OnGetText do Field do Cds que você quer aplicar regras… nesse mesmo post eu
falo sobre o uso desse evento:

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/#comment-78

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/#comment-152

[]’s
Responder

Gabriel disse:
02/07/2013 às 7:04 pm

Queria Saber o codigo de fazer procura por letra em DBGRID via textbox, por exemplo eu Coloco a Letra ‘A’ aparece somente
pessoas com a letra A no DBGRID… OBG
Responder

Diego Garcia disse:


02/07/2013 às 7:53 pm

Gabriel, existem diversas formas de se fazer isso, mas em todas que conheço, a busca não é feita no DBGrid, mas
sim no DataSet em quem o DBGrid está ligado através de seu DataSource.

[]’s
Responder

Eduardo disse:
08/07/2013 às 11:14 am

Ola.. Achei muito boa suas dicas, vou utiliza-las, porem estou com um problema e gostaria da sua ajuda…

Possuo uma query que é usada para formar o DbGrid.. “SELECT ID_USUARIO FROM DYNAMICS_USUARIO ORDER BY
ID_USUARIO” …
Porém, vou adicionando usuarios conforme seja clicado em um botão no form para adicionar usuarios..
Quando adiciono um novo usuario, a query é fechada e aberta denovo… Ordenando os usuarios por Id_usuario.. Neste
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
momento
Para saber insiro
mais, inclusive sobreem uma
como variavel
controlar ‘USUARIO’
os cookies, o nome
consulte aqui: deste
Política usuario.
de cookies

Oque eu preciso… Pegar este ultimo usuario inserido e seleciona-lo no Grid. Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 19/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Estou com dificuldades em testar os campos do grid com a variavel USUARIO.. para poder seleciona-lo no grid

Estava tentando da seguinte forma..


//Após inserir um novo usuario, fecha o query e abre denovo para atualizar o DbGrid
ADOQuery1.close;
ADOQuery1.Open;
for i:= 0 to datasource1.dataset.recordcount -1 do // lista todos os usuarios do Dbgrid
begin
if (dbgrid1.columns.items[i].field.text = usuario) then
DBGrid1.SelectedRows.Items[i];
end

Se puder me ajudar eu agradeço.. Obrigado


Responder

Eduardo disse:
08/07/2013 às 11:16 am

Tentei usar o RECNO do datasource… porem, ele pega sempre o ultimo adicionado, e após a ordenação dos nomes,
esse indice fica errado.
Responder

Diego Garcia disse:


10/07/2013 às 2:19 pm

Opa Eduardo, obrigado pelo FeedBack.

Uma duvida, na sua Query você só está trazendo o ID do usuário? digo isso porque se você trouxer
também o Nome do usuário (que é o valor que você grava na sua variavel usuário pelo que entendi) você
poderia fazer um LOCATE no seu componente ADOQuery, pelo campo de nome do usuário.

Espero ter ajudado, caso ainda não tenha conseguido resolver, é só postar aqui que eu lhe ajudo com
muito prazer.

[]’s

Jessé disse:
19/07/2013 às 11:02 am

Bom Dia!

Depois de executar uma ação determinada, algumas celulas recebem, o texto:


Baixado Alterado, então:

Estou usando este codigo no evendo OnDrawColumnCell…

if (Column.Field.FieldName = ‘situacao’) then


begin
if DM2.ZQORDEMS.FieldByName(‘situacao’).AsString = ‘BAIXADO ALTERADO’ then
begin
DBGrid1.Canvas.Brush.Color:= clLtGray; //”pinta” a celula inteira
DBGrid1.Canvas.Font.Color:= clRed; //”Pinta” a letra
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.DefaultDrawColumnCell(Rect,
Privacidade DataCol,
e cookies: Esse site utiliza cookies. Ao continuar a usar este site,Column, State);
você concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies
end;
end; Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 20/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Mais a duvida eh a seguinte:


– Como deixo o Baixado com a cor normal (preta mesmo) e soh o ALTERADO em vermelho ???
– E se tem como deixar o BAIXADO com fonte normal e fundo normal tmbm, soh o ALTERADO em vermelho e com fundo
cinza ??

Será que é muito complicado de fazer ??! Espero não estar atrapalhando, mais é que não consegui respostas claras e
objetivas, que funcionassem, em minhas pesquisas pelo Google.

Abraços!!!
Responder

Diego Garcia disse:


19/07/2013 às 12:48 pm

Opa Jessé? blz.

Acredito que não seja possível na mesma célula alterar a forma como determinadas palavras são printadas na tela,
lhe recomendo colocar cada palavra em um célula especifica para facilitar o seu tratamento visual.

[]’s
Responder

Jessé disse:
19/07/2013 às 1:13 pm

Blz cara!

Vlw ai pela atenção!!


Então realmente creio que a minha ideia inicial seja meio que loucura. Voce tem alguma sugestão de uso ??
De colocar cada palavra em uma célula mais de um jeito q nao fique estranho no grid.
Porque tipow vai fica um em cada coluna, e fica como se fosse duas informações independentes não sei.

Abraços!!

Diego Garcia disse:


19/07/2013 às 2:41 pm

Olha, dessa forma que você está querendo, eu não consigo ter uma boa ideia. Mas você pode fazer essa
informação ficar em um DBText, na verdade, dois DBText, um da cor preta e outro da cor vermelha por
exemplo, ai o DBText fica embaixo do DBGrid ou encima, depende muito da forma como está sua
interface.

[]’s

Jessé disse:
19/07/2013 às 2:46 pm

Então, tá meio complicado mesmo viw. Mais ok sem problemas.


Vo..da uma olhada qui nas opções e ve o que se se encaixa melhor aqui no meu projeto. Obrigado pela
atenção.
Abraços!!!

Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Gustavo de Melo disse:
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies
23/07/2013 às 8:58 am

Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 21/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Olá Diego, tudo bem?


Cara, parabéns pelo post. Valeu!
Abraço.
Gustavo.
Responder

Diego Garcia disse:


23/07/2013 às 9:02 am

Opa Gustavo, muito obrigado, fico feliz que tenha gostado.

[]’s
Responder

Robert disse:
22/08/2013 às 1:46 am

Olá,
No DBGrid zebrado ao aplicar o filtro a “zebra fica com as listras “misturadas”.
Já tentei varias formas, você tem ideia de como resolver isto.

Abs.
Responder

Diego Garcia disse:


22/08/2013 às 6:46 am

Opa Robert, blz?

Cara, filtrar DataSet com DBGrid zebrado é meio complicado mesmo. A unica solução que meio veio na cabeça
inicialmente é criar uma variável booleana no escopo do formulário onde você passaria a checar o valor dela e não
mais o RecNo, exemplo:

1 procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;


2 DataCol: Integer; Column: TColumn; State: TGridDrawState);
3 begin
4 with DBGrid1 do
5 begin
6 if Self.FControleZebraDBGrid then //está declarado no private do formulário
7 Canvas.Brush.Color := clSilver
8 else
9 Canvas.Brush.Color := clMoneyGreen;
10
11 Self.FControleZebraDBGrid := not Self.FControleZebraDBGrid;
12 Canvas.FillRect(Rect);
13 DefaultDrawColumnCell(Rect,DataCol,Column,State);
14 end;
15 end;

[]’s
Responder

Robert disse:
04/09/2013 às 1:34 am

Não deu certo.


Alguma outra tentativa?
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Responder
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies

Robert disse: Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 22/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia
04/09/2013 às 3:06 am

Resolvi o problema com esta dica:

1º Declare o Tipo TMyDBGrid = class(TDBGrid);

2º, No evento OnDrawColumnCell da DBGrid poe o codigo:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;


DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if (TMyDBGrid(DBGrid1).DataLink.ActiveRecord+1) mod 2 = 0 then
begin
if gdFocused in State then
begin
end
else
begin
DBGrid1.Canvas.Brush.Color := clSkyBlue;
DBGrid1.Canvas.Font.Color := clBlack;
end;
DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
end;

3º No Evento AfterScroll do TDataSet(pode ser tabela ou query):

procedure TForm1.Table1AfterScroll(DataSet: TDataSet);


begin
DBGrid1.Invalidate;
end;

Diego Garcia disse:


04/09/2013 às 8:55 am

Excelente o Hack Robert.. Muito obrigado por ter compartilhado…

[]’s

hemelen disse:
31/08/2013 às 6:49 pm

Existe uma possível codificação para que fique selecionado sempre o último dado inserido na grid ? Obg
Responder

Diego Garcia disse:


02/09/2013 às 11:50 am

Hemelen,
Se o ultimo inserido sempre estiver no final do DataSet, basta vc colocar DataSet.Last no evento OnDataChange
do seu TDataSource.

abs
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Responder
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies

Fechar e aceitar
Hemelen disse:

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 23/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia
06/09/2013 às 8:19 pm

Obrigada, utilizarei no meu TCC

Diego Garcia disse:


06/09/2013 às 9:21 pm

Opa maravilha… Precisando de ajuda é só falar.

[]’s

Fausto Alencar disse:


03/09/2013 às 7:43 pm

Olá Diego
Primeiramente é sempre bom saber que existem pessoas com intuito de ajudar, esse fórum é 10.
Vi em um soft na empresa que trabalho, um DBGrid, com varias colunas, tipo, Razão Social, Nome Fantasia entre outros. Até
ai tudo bem, mas para efetuar uma consulta, basta clicar em cima de uma célula da coluna, não precisa ser no titulo, e
escrever o nome fantasia, ou mesmo parte dele, em um Edit, que a pesquisa é feita em cima daquela coluna selecionada.
Como fazer isso ?
Responder

Diego Garcia disse:


04/09/2013 às 11:45 am

Opa Fausto, tudo bem?


Antes de mais nada, muito obrigado pela força… fico feliz em saber que estou ajudando alguém =)

Sobre a sua pergunta, uma maneira bem simples de fazer isso é utilizar o evento OnCellClick do DBGrid desta
forma:

1 procedure TForm1.DBGrid1CellClick(Column: TColumn);


2 var
3 sTexto: String;
4 begin
5 sTexto := InputBox('Pesquisa',format('Realizar pesquisa no campo %s',[Column.Title.C
6 DBGrid1.DataSource.DataSet.Locate(Column.FieldName,sTexto,[loPartialKey,loCaseInsens
7 end;

Obviamente não está 100%, ai é questão de ir adaptando a sua necessidade e ir tratando algumas possíveis falhas.
Espero que tenha ajudado.
[]’s
Responder

Fausto Alencar disse:


04/09/2013 às 10:25 pm

Olá Diego, cá estou de volta, sobre minha duvida anterior, ela ainda persiste, bem, minha procedure ficou assim:

procedure TFormListaContatos.DBGrid1CellClick(Column: TColumn);


begin
inherited;
var
sTexto:
Privacidade String;
e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies
begin
sTexto := InputBox(‘Pesquisa’,format(‘Realizar pesquisa no campo %s’,[Column.Title.Caption]),EmptyStr); Fechar e aceitar
DBGrid1.DataSource.DataSet.Locate(Column.FieldName,sTexto,[loPartialKey,loCaseInsensitive]);

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 24/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

end;

Só que não compila, dá erros:


[Error] UntListaContatos.pas(329): Statement expected but ‘VAR’ found
[Error] UntListaContatos.pas(332): Undeclared identifier: ‘Column’
[Error] UntListaContatos.pas(332): Missing operator or semicolon
[Error] UntListaContatos.pas(335): ‘.’ expected but ‘;’ found
[Fatal Error] PrjPrincipal.dpr(76): Could not compile used unit ‘UntListaContatos.pas’

Algumas perguntas tipo, na procedure o que seria o sTexto,


Sou amante do Delphi, mas não frequento uma cadeira, por isso as vezes peco pelo não saber.

Att

Fausto Alencar
Responder

Diego Garcia disse:


04/09/2013 às 10:38 pm

Opa Fausto… O sTexto é uma variável do tipo string.

A sua procedure esta dando erro de compilação por causa de um “begin” e um “inherited” que estão sobrando. =)

Apague duas linhas antes da palavra Var que ira funcionar.

[]’s
Responder

omor disse:
06/09/2013 às 3:19 pm

como pegar o nome das columns dinamicamente? Sem prefixo? Exemplo na tabela está assim Cont_Nome, Cont_Endereco
,como pegar somente Nome e Endereco e listá-lo no dbgrid?
Responder

Diego Garcia disse:


06/09/2013 às 3:23 pm

Opa, tudo bom?

Acho que não entendi a sua pergunta. Você quer que o titulo das colunas apareça sem prefixo no grid? você quer
recuperar o nome dos campos e colocar em uma variável?
Me mande um pouco mais de detalhes =)

[]’s
Responder

hemelen disse:
14/09/2013 às 10:38 pm

Euegostaria
Privacidade desite
cookies: Esse saber , se
utiliza é possível
cookies. implementar
Ao continuar emvocê
a usar este site, umconcorda
Dbgrid a seguinte
com seu uso. situação : gostaria que a cada item adicionado a
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies
grid uma coluna indicasse a linha correspondente, por exemplo:
Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 25/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Cód Item Nome do Produto Preço


001 A 2

pois, acontece que ,utilizando o generator do próprio Ibdataset, ele não reinicia com valor 001(ou 1). O que ocorre é que a
cada nova inserção, ele segue a sequencia anterior do último cadastro. Obg
Responder

Diego Garcia disse:


16/09/2013 às 11:36 am

Opa Hemelen, tudo bem?

Você pode usar o controle de generator na mão e não por trigger, mas, o correto é, utilizou um id uma vez, esse id
pertence aquele registro para sempre, mesmo se, esse registro for excluído.
Mas se você só precisa do numero do registro dentro do DataSet, você pode utilizar o DataSet.RecNo, mas isso não
é um id, é apesar o numero do registro dentro do DataSet.

[]’s
Responder

hemelen disse:
20/09/2013 às 9:49 pm

Outra dúvida, como eu faço para um campo no DBgrid receber uma variável e por exemplo, eu gostaria que
na primeira linha da grid, esse valor fosse 01, na segunda linha 02 e assim por diante … OBG ^^

Diego Garcia disse:


20/09/2013 às 10:29 pm

Então, o DBGrid trabalha vinculado com um Dataset, então, se você quer atribuir uma variável aos
campos do Dataset, você pode trabalhar com campos calculados e usar o evento OnCalcFields para
preencher o valor deste campo…

[]’s

Bruno disse:
17/09/2013 às 7:03 pm

Olá Diego, atraz tal como o amigo Gabriel, precisava criar uma area no meu cadastro de clientes feito em Delphi XE3 para
pesquisar por nome na minha DBgrid ligada ao access 2010 e nao vejo jeito sera que pode dar uma mao?? Obrigado e
parabens pelo blog.
Responder

Diego Garcia disse:


18/09/2013 às 12:03 pm

Opa Bruno, tudo bem?


Qual a forma que você está usando para conectar no Access? ADO? o DataSet do DBGrid é um ADOQuery?
Se sim, você pode usar algo do tipo:

1 ADOQuery1.Locate('Campo','Valor',[loPartialKey]);

[]’ssite utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Privacidade e cookies: Esse
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies
Responder

Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 26/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Bruno disse:
18/09/2013 às 12:40 pm

Obrigado pela atenção Diego, bem eu tenho as coisas feitas desse modo, estou ligando ao access via
ADOconnection do DBGrid no Delphi XE3 e preciso fazer um campo para consulta por nome só isso, mas
como sou iniciante nao tou chegando la, deixo aqui meu mail para se for preciso trocarmos alguma
informação ou talvez enviar-lhe para se fizer o favor de dar uma olhada no que esta feito.

meb_antunes@hotmail.com

Muito obrigado.

Rafael disse:
19/09/2013 às 3:24 pm

Diego, boa tarde.


Muito bom o seu post, esclarece muitas coisas.
Gostaria de saber como eu faço para colocar o titulo de uma coluna em duas linhas.
por exemplo:
‘Custo médio unitário de funcionário em Horas’
ficar assim:
‘Custo Médio Unitário
de Funcionário em Horas.’
Responder

Diego Garcia disse:


20/09/2013 às 11:53 am

Opa Rafael tudo bom?


Muito obrigado pelo Feedback.

Sobre a sua duvida, acredito que não seja possível fazer isso.

[]’s
Responder

Rafael Pires disse:


14/10/2013 às 1:50 pm

Beleza Diego.
Entendi, estou tentando e fazendo alguns testes, mas nada feito.
Caso encontro alguma solução, vou postar aqui!

Até mais!

Rafael Estevão disse:


19/09/2013 às 5:08 pm

Muito bom seus post Diego!


estou com um problema:

tenho um DbGrid(trabalho com componente TwwDBGrid) que lista alguns registros, a 1ª coluna é um campo calculavél do
tipo
Privacidade booleano,
e cookies: nas
Esse site fields
utiliza do dbgrid
cookies. alterei
Ao continuar o este
a usar editcontrol do campo
site, você concorda para
com seu uso.virar um checkbox, ok, funciona de boa, mas só
consigo
Para saber selecionar
mais, inclusive apenas
sobre como umosdos
controlar registros,
cookies, consultequando voudeselecionar
aqui: Política cookies outro ele desmarca o anterior e marca o atual que cliquei.

Fechar e aceitar
no grid em options, já alterei a propriedade dgMultiSelect = True, dgEditing = True, mas não funciona, alguma dica?

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 27/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia
Responder

Diego Garcia disse:


20/09/2013 às 11:54 am

Opa Rafael, tudo bom?

Será que isso não é uma limitação do componente que você está utilizando?
Eu realmente não conheço esse componente.

[]’s
Responder

JNeto disse:
25/09/2013 às 10:39 pm

Diego, em primeiro lugar, obrigado por compartilhar seu conhecimento. Em segundo, quero uma forcinha tua…
heheheheheh. É o seguinte… desenvolvi um aplicativo para ler um banco de dados (usei o Firebird) lá na empresa. O
programa funciona direitinho, mas eu gostaria de poder ao dar um duplo clique no DBGrid abrisse um novo form para que
eu pudesse visualizar melhores as informações (digamos que no meu DBGrid aparecem apenas as informações cruciais),
além de editar, excluir e criar um novo registro. Sei que é possível, mas não consigo. Pode me ajudar?
Responder

Diego Garcia disse:


26/09/2013 às 11:30 am

Opa João tudo bom?


Obrigado pelo feedback!
Sobre a sua duvida, você pode usar o evento OnDblClick do DbGrid e neste você pode abrir um formulário com os
dados do registro selecionado no DataSet no momento (quando você clicar no DBGrid ele vai deixar o ponteiro do
DataSet no registro que você clicar).
Para mostrar os dados no formulário você pode usar os componente DataControls (DbEdit, DbText, etc.). Para
salvar o registro você pode por exemplo colocar um botão que no evento OnClick dele você fala algo do tipo
SeuDataSet.Post.

O conceito é mais ou menos esse, ai precisa entender como está implementada a sua solução.

[]’s
Responder

Bruno disse:
26/09/2013 às 2:01 pm

Olá Diego, tenho estado vendo seus posts e em primeiro lugar felicitar você por isso, grande ajudo voce esta dando a todos.
Aproveito para colocar uma questão que em tempos aqui deixei mas nao consegui resolver. Tenho uma pequena base de
dados de clientes ligada a uma tabela de access 2010 feita em Delphi XE3 ta ok com a inserçao de novos nomes etc, eu
preciso é de colocar um botao ou até uma barra de texto para que ao introduzir o nome pretendido ele va procurar na DBGrid
pois já vao sendo muitos nomes e andar com o Scroll ate achar é duro.
Será que pode me dar uma ajudinha??
Abraço.
Responder
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies
Diego Garcia disse:
Fechar e aceitar
26/09/2013 às 2:56 pm

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 28/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Opa Bruno tudo bom?

Muito obrigado pelo feedback, isso é extremamente importante para nos motivar a continuar =)

Sobre a sua duvida, procure pelo método Locate do seu DataSet que está vinculado ao DBGrid.

[]’s
Responder

Bruno disse:
26/09/2013 às 5:44 pm

Mais uma vez obrigado Diego, bom vou dar uma olhada logo digo.

Abraço e boa continuação.

Bruno disse:
26/09/2013 às 6:17 pm

Oi Diego, ja estive dando uma olhada mas de facto o meu conhecimento é muito fraco. No meu cadastro de clientes, eu tenho
uma ADOConnection, uma ADOTable, um DataSource uma DBGrid e uma Navigation Bar nada mais, como deveria fazer
esse comando que preciso? A coluna onde interessa procurar é a do NOME na DBGrid.Qhe comando devo utilizar e onde o
deveria colocar? Desculpa a falta de conhecimento mas ja fiz a algum tempo este cadastro e estou agora começando a
dedicarme um pouco mais.

Bom trabalho e obrigado.


Responder

Diego Garcia disse:


26/09/2013 às 6:28 pm

Vamos lá Brunão.
Imagine que no seu form que possui o DBGrid você tem os seguintes componentes:

edtPesquisa : Um TEdit responsável por armazenar o texto que o usuário deseja pesquisa.
btnPesquisar : Um TButton que realiza a pesquisa para o usuário.

Agora, no evento OnClick do botão btnPesquisar, você pode colocar o seguinte código:

1 ADOTable1.Locate('NOME',edtPesquisa.text,[loPartialKey,loCaseInsensitive]);

(Lembrando que ADOTable1 deve ser substituído pelo nome do seu TADOTable).
Esse código fará com que seja pesquisado no campo NOME o valor que esteja digitado no edit edtPesquisa, sendo
que será uma pesquisa parcial (semelhante ao LIKE do SQL) e não irá distinguir maiúsculo de minusculo.
Espero que tenha ajudado, qualquer duvida é só entrar em contato.

[]’s
Responder

Bruno disse:
26/09/2013 às 7:56 pm

Você é amigao mesmo, vou ja fazer o teste ja comento algo com voce.
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Brigado.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies

Fechar e aceitar
Bruno disse:

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 29/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia
28/09/2013 às 11:46 pm

Oi diego como vai?? espero que bem. Em relação à sua ajuda, está funcionando direirinho o assunto está
resolvido amigo, venho colocar uma pequena questão em relação à Navigation Bar, ela tem um botão penso
ser para refresh ou coisa do genero, será possivel dizer a ele para fazer um refresh à DBGrid??? eu estou
correndo o cadastro de clientes em rede ou seja o Access com a tabela está num computador e outros tres
acedem à mesma e se sao inseridos dados ao mesmo tempo uns nao vem as alteraçoes até que fechem a
aplicação e voltem a entrar, a ideia é sem sairem da aplicação fazerem refresh para actualizar a DBGrid.

Mais uma vez muito obrigado pela sua ajuda você é o maximo valeu?!

Abraço.

Diego Garcia disse:


29/09/2013 às 1:44 pm

Brunão, eu não sou grande fan de usar o DBnavigator, eu lhe recomendo colocar na sua aplicação um
botão com esse intuito. Ai você da um refreash no DataSet no evento OnClick desse botão, caso não
resolva, tente fechar e abrir o DataSet.

[]’s

Bruno disse:
30/10/2013 às 4:37 pm

Oi Diego tudo bom?? olhe eu lhe enviei um e-mail para sua conta do gmail pedindo uma pequena ajuda sera
que ja viu?? nao o ocupo muito mas é que estou laborando fora da minha cidade e esta dificil finalizar isto,
agradecia se pudesse dar uma olhada no mail por favor.

Grande abraço.

Rosevaldo Silva disse:


27/09/2013 às 9:18 am

Bom dia Diego, vê se pode me ajudar. Quero colocar uma imagem no fundo do dbgrid, como se fosse uma marca d’água. Já
procurei em diversos post’s pela net mas ainda não encontrei nada satisfatório. você tem alguma sugestão? ps. Seu post
sempre em evidência!! Parabêns!
Responder

Diego Garcia disse:


27/09/2013 às 11:22 am

Opa Rosevaldo, tudo bom?

Infelizmente nunca vi isso funcionando em um DBGrid, mas você pode tentar usar um TStringGrid.

Não cheguei a implementar, mas nesse post tem um exemplo de como fazer :
http://delphi.about.com/od/vclusing/a/owner-drawing-delphi-string-grid.htm

Dependendo da versão do Delphi que você esteja usando, você pode usar o TStringGrid com o LiveBindings, ai ele
irá funcionar muito semelhante a um DBGrid.

Espero que tenha ajudado.


Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies
[]’s
Responder
Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 30/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Hemelen disse:
08/10/2013 às 8:20 pm

Olá, estou fazendo uma aplicaçao em delphi , e gostaria que ao clicar em uma coluna do dbgrid, abrisse outro dbgrid. Até ai
consegui fazer, o problema é que realizei o seguinte procedimento :
procedure Tfrmtotalvendames.DataSource2DataChange(Sender: TObject;
Field: TField);
begin
frmitem.dtsitem.Close;
frmitem.dtsitem.ParamByName(‘cod’).AsInteger := Qryvenda.FieldByName(‘venda_pk’).AsInteger;
frmitem.dtsitem.Open;

e o meu segundo dbgrid nunca abre, mesmo com duplo clique. O que poderia ser feito para abrir com um duplo clique do
usuario? OBG
Responder

Rosandro. disse:
09/10/2013 às 1:39 am

Parabéns pelo tutorial e pelas ótimas dicas, está me ajudando muito!


Responder

Diego Garcia disse:


09/10/2013 às 11:22 am

Opa Rosandro, muito obrigado.

[]’s
Responder

mih disse:
11/10/2013 às 6:49 pm

Olá Diego, muito bom seu site. Tenho uma dúvida ( sou iniciante) fiz uma um banco no acess 2007 , e um dos campos é data
até ai tudo bem , mas o problema é que eu não consigo fazer uma pesquisa pelo mês, e mostrar no DBGrid. vc teria alguma
sugestão para me ajudar?
além disso teria como colocar os dados das pesquisa em ordem crescente?
deste já agredecida!!
Responder

Diego Garcia disse:


14/10/2013 às 1:51 pm

Olá Mirelle, obrigado pelo feedback.

Sobre o seu desafio, se você quer fazer uma pesquisa você pode usar o método Locate no seu ADOTable (levando
em consideração que você está usando ADO e um ADOTable para carregar a tabela, se for um ADOQuery o
principio é o mesmo). Caso você queira fazer uma filtro, você pode usar a propriedade Filter em conjunto com a
propriedade Filtered.

Para
Privacidade e cookies: Esse siteos dados
utiliza aparecerem
cookies. ordenados,
Ao continuar você
a usar este site, você pode criar
concorda comum índice
seu uso. no seu ADOTable.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies

Caso ainda esteja um pouco complicado, pode entrar em contato que eu lhe ajudo.
Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 31/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

[]’s
Responder

Bruno disse:
18/10/2013 às 8:35 am

Oi Diego tudo bom, em primeiro lugar agradecer a voce a ajuda que me deu em relaçao à DBGrid, em
segundo felicitar mais uma vez o blog pois ja vi que esta sempre ajudando toda gente. Em terceiro lugar,
venho deixar duas questões no ar, eu tal como disse antes, tenho uma DBgrid e uma ADOTable conectado ao
access 2010, venho pergruntar se ha possibilidade de proteger uma ou mais linhas na grid e esconder elas ou
que os dados estejam invisiveis???
A otra situação é se existe possibilidade de adicionar files as linhas ou seja, cada linha tem informação de um
cliente, para alem dos varios dados como nome,morada,contacto etc., eu necessitava adicionar files na ficha
desses clientes como por exemplo copias de documentos relacionados, doc´s e PDF´s.

Grande abraço e boa continuação.

Bruno

César disse:
14/10/2013 às 6:07 pm

Boa noite Diego, estou tentando resgatar um valor do SQL, mas eu não quero resgatar um campo selecionado, eu gostaria por
exemplo de selecionar o registro 1 da coluna X, tem como eu fazer isso ? Eu sei fazer em php…mas eu não consegui em
delphi..haaha..tem como me ajudar ?
em php seria algo do genero: $dados = mysql_fetch_array($query); $var1 = $dados[‘var1’];

Abraços e parabéns pelo post muito util e muito bem explicado.


Responder

Diego Garcia disse:


14/10/2013 às 6:19 pm

Opa César, tudo bom?


Obrigado pelo Feedback…

Acho que não entendi a sua duvida.


Se você quer voltar uma coluna “X” de um DBGrid na linha selecionada você pode fazer desta forma:

1 var
2 iX : integer;
3 begin
4 iX := 2; //numero da coluna do DBGrid, começando em 0
5 DBGrid1.Fields[iX].AsString;
6 //...
7 end;

Não sei se ajudo.

[]’s
Responder

César disse:
14/10/2013 às 6:29 pm

Privacidade e cookies: Esse siteAjudou, mas Ao


utiliza cookies. nacontinuar
verdade eu nao
a usar quero
este site, você ter nemcom
concorda linha
seu selecionada,
nem coluna selecionada. Eu quero por
uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies
exemplo, pegar o valor da coluna X e da linha Y sem precisar selecionar nada, é possivel ?por exemplo, valor1
:= DbGrid1.Cells[2,3]; algo desse genero Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 32/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

César disse:
14/10/2013 às 6:43 pm

Consegui Diego.

for i:=1 to Dbgrid1.DataSource.DataSet.RecordCount do


begin
DBGrid1.DataSource.DataSet.RecNo := i;
showmessage(dbgrid1.Fields[0].AsString);
end

Obrigado

Diego Garcia disse:


15/10/2013 às 10:24 am

Otimo, outra forma de fazer isso é:

1 DBgrid1.DataSource.DataSet.First;
2 while not DBGrid1.DataSource.DataSet.Eof do
3 begin
4 showmessage(DBgrid1.Fields[0].AsString);
5 DBGrid1.DataSource.DataSet.Next;
6 end;

[]’s

Bruno disse:
22/10/2013 às 6:18 am

Oi Diego tudo bom, escrevo aqui porque atraz acho que botei no lugar errado, em primeiro lugar agradecer a voce a ajuda que
me deu em relaçao à DBGrid, em segundo mais parabens para o seu blog pois ja vi que esta sempre ajudando toda
gente.Venho deixar duas questões no ar, eu tal como disse antes, tenho uma DBgrid e uma ADOTable conectado ao access
2010, venho pergruntar se ha possibilidade de proteger uma ou mais linhas na grid e esconder elas ou que os dados estejam
invisiveis???
A otra situação é se existe possibilidade de adicionar files as linhas ou seja, cada linha tem informação de um cliente, para
alem dos varios dados como nome,morada,contacto etc., eu necessitava adicionar files na ficha desses clientes como por
exemplo copias de documentos relacionados, doc´s e PDF´s.

Grande abraço e boa continuação.

Bruno
Responder

Diego Garcia disse:


22/10/2013 às 4:41 pm

Opa Bruno, sobre esconder as linhas, eu trabalharia com filtro do ADOTable (propriedades Filter para definir o
filtro e Filtered para ativar ou desativar o filtro). Sobre o arquivo, você pode trabalhar com campos blob, mas eu
não recomendo. Você pode também salvar os arquivos em um determinado diretório e na sua tabela você pode
armazenar o caminho para esse arquivo. Eu particularmente não gosto desse conceito de trabalhar com arquivos
em banco de dados, mas se não tiver solução, existem essas possibilidades.

[]’s
Responder
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies

Fechar e aceitar
Cristiano disse:

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 33/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia
23/10/2013 às 11:26 am

Diego, bom dia


Tenho um JVDBGrid em uma aplicação. Na mesma aplicação utilizo o DBGrid. Diferente de outros casos, gostaria de inserir
um check box na coluna do DBGrid. Minha intenção seria excluir dados em massa, ou ate mesmo imprimir itens
selecionados. Poderia nos ajudar?
Cara, seu post é massa. Ainda bem que existem caras como voce e Andre L. Celestino ( duas feras em delphi) para nos ajudar.
Grato, Cristiano
Responder

Diego Garcia disse:


23/10/2013 às 11:34 am

Opa Cristiano, tudo bom?


Muito obrigado pelas suas palavras, esse tipo de incentivo é realmente muito significante.
Sobre a sua duvida, acredito que você pode usar a dica Inserir um checkbox em um coluna deste próprio
post.
Como você pode trabalhar com um campo do tipo Boolean, você pode levar em consideração os valores desta
coluna para determina se será realizada a exclusão ou não do registro, por exemplo:

1 DBGrid1.DataSource.DataSet.First;
2 while not DBGrid1.DataSource.DataSet do
3 begin
4 if DBGrid1.DataSource.DataSet.FieldByName('Excluir').AsBoolean then
5 DBGrid1.DataSource.DataSet.Delete
6 else
7 DBGrid1.DataSource.DataSet.Next;
8 end;

Responder

Cristiano disse:
23/10/2013 às 1:37 pm

Diego, boa tarde. Tudo bem.


Detalhe, não sei se me expressei direito. Quando me referi a coluna, quis dizer naquela parte cinza do
DBGrid, Ou no começo ou no final dele. Se for esta a declaração, coloco onde? Em algum evento do Grid?
Obrigado e no aguardo,

Cristiano

Diego Garcia disse:


23/10/2013 às 1:56 pm

Acredito no caso então Cristiano que você esteja se referindo ao titulo da coluna, sendo assim, eu desconheço uma
maneira de fazer isso, lhe recomendaria um botão ou até mesmo um label estilo link com uma opção do tipo
“Marcar/Desmarcar Todos”

[]’s
Responder

Cristiano disse:
23/10/2013 às 2:10 pm

OK Diego,
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Muitosobre
Para saber mais, inclusive obrigado pelas os
como controlar informações. Vou
cookies, consulte aqui:decidir o que
Política de for
cookies mais viavel.
Fica com Deus,
Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 34/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Cristiano
Responder

Cristiano disse:
23/10/2013 às 3:31 pm

Diego, mais uma questão.


Suponhamos que eu teria que colocar status em dados do DBgrid. Explico.
Tenho cadastrado NFs em um DBGrid. Essas notas ficam em cor branca. Quando eu entregasse elas a meu clientes e desse
um duplo clique, ela representasse a cor de ENTREGA REALIZADA ou então uma coluna no GRID me aparecesse apenas o
status de Entregue ou Pendente. Teria como?

No aguardo,
Cristiano
Responder

Cristiano disse:
24/10/2013 às 2:57 pm

Diego, boa tarde


Será que consigo algo para meu caso acima? Alguem que poderia me ajudar?
Ficarei no aguardo,

Cristiano
Responder

Cristiano disse:
01/11/2013 às 12:04 pm

Diego, boa tarde

Poderia nos ajudar neste caso?

Valeu,

Cristiano

Diego Garcia disse:


01/11/2013 às 12:08 pm

Opa Cristiano tudo bom?


Você poderia fazer uma rotina no DbClick do DBGrid que marcaria a NFe como Entrega Realizada, ai
provavelmente você teria um campo com o Status da NFe e uma rotina para colorir as linhas do grid de acordo
com os valores desse campo.

seria isso?

[]’s
Responder

Cristiano disse:
05/11/2013 às 10:11 pm

Privacidade e cookies: Esse siteOla Diego,


utiliza boa
cookies. noite a usar este site, você concorda com seu uso.
Ao continuar
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies
Exato, é disso mesmo que eu preciso. Eu so não saberia como iniciar essa rotina.
MInha ideia na verdade era outra. Imagine um DBgrid com o cabeçalho da coluna com o checkbox,
Fecharclicacaria
e aceitar
em todos que eu quisesse baixar como ENTREGA REALIZADA OU PENDENTE. Mas pelo que vi somente o

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 35/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Visual Studio da essa opção, que se chama Column Header. No delphi talvez desse certo com Data Grid ou
Listview.
Mas de qq forma, agradeço sua ajuda. Se puder me ajudar na rotina.Agradeço,
Cristiano

Luiz Otávio de Moraes disse:


28/10/2013 às 3:03 pm

Diego, você pode me ajudar? estou com uma dúvida que ronda minha cabeça a um bom tempo e ja procurei em todo lugar e
nao achei.
Eu sou iniciante em Delphi 7, e eu gostaria que pudesse me ajudar com isso:
fazer uma pesquisa em um DBGrid usando um Edit, e conforme eu digito o nome parcialmente no Edit, apareça SOMENTE
os nomes que sao iguais ou semelhantes ao do Edit,
Tenho um IBTable, IBDatabase, IBTransaction e um Data Source dentro do meu Data Module.
Fico ansioso pela resposta.
Desde já, Obrigado.
Att

Luiz Otávio.
Responder

Diego Garcia disse:


28/10/2013 às 3:15 pm

Opa Luiz, tudo bom?


Sobre o Delphi 7 fica difícil eu lhe ajudar porque não uso ele, só usei do Delphi 2006 para frente, mas por acaso
você já tentou trabalhar com filtro? exemplo:

1 IBTable1.filtered := false;
2 IBTable.filter := 'campoNome LIKE ' + QuotedStr(Edit1.text+'%') ;
3 IBTable1.filtered := true;

Sinceramente não sei se vai funcionar no componente IBTable principalmente na versão do Delphi 7, você pode
tentar usar um ClientDataSet, talvez funcione.

[]’s
Responder

Luiz Otávio de Moraes disse:


29/10/2013 às 9:43 pm

Irei tentar este código, se der, dou um Edit por aqui :p


Obrigado.

Luiz Otávio de Moraes disse:


29/10/2013 às 9:53 pm

CARA VOCÊ É DEMAIS!


NOSSA, SALVOU MINHA PÁTRIA *-*

Só tive que mudar algumas coisinhas, veja como ficou o código final:

dm_dados.tbl_contatos.filtered := false;
dm_dados.tbl_contatos.Filter := ‘NOME LIKE ‘ + QuotedStr(Edit1.text+’%’) ;
Privacidade e cookies: Esse sitedm_dados.tbl_contatos.filtered := você
utiliza cookies. Ao continuar a usar este site, true;
concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies

MUITO MUITO OBRIGADO!


Fechar e aceitar
poderia dar uma olhadinha no meu canal do youtube? veja:

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 36/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

http://www.youtube.com/user/TutosDelphi7

Tem umas coisas bem básicas ai ….


Mas agora vou começar como desenvolver um programa que tem conexão com banco de dados e uns outros
componentes …

Diego Garcia disse:


29/10/2013 às 11:00 pm

Excelente que funcionou

Irei dar uma olhada no canal com certeza!!!


Grande abraço!

Luiz Otávio de Moraes disse:


12/11/2013 às 2:48 pm

Diego, acho que aqui nao é o melhor lugar para fazer esta pergunta … mas talvez você possa me ajudar denovo.
é o seguinte, estou fazendo um programinha bem simples (uma agenda virtual), ela funciona muito bem, certinho e tal,
quando eu compilo ela dentro do delphi, funciona certinho, mas quando eu quero rodar o programa pelo arquivo executável,
da o seguinte erro: UNAVAIBLE DATABASE
OBS: todos os componentes para ligação com o Banco de Dados estão ativados.

O que devo fazer? tem como arrumar isso?


Responder

Diego Garcia disse:


14/11/2013 às 11:26 am

Mestre, eu lhe recomendo deixar sempre os componentes de conexão fechado e abrir as conexão em RUN-TIME…
qual é o banco que você está usando? essa mensagem de erro ocorre quando o software não consegue se
comunicar com o Bando de Dados.

[]’s
Responder

Eugenio Andrade disse:


12/11/2013 às 4:53 pm

Diego, tenho uma questão: Numa tabela eu gravo o código, mas gostaria de
mostrar no grid a descrição, nome etc, Ex. numa tabela de contrato gravo
o código do cliente, com esse código resgataria da tabela cliente o nome
e mostraria no grid, é possível??
Desde já grato
Responder

Diego Garcia disse:


14/11/2013 às 11:27 am

É sim… você pode usar campos de lookup ou carregar o grid a partir de uma query.

Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
[]’ssobre como controlar os cookies, consulte aqui: Política de cookies
Para saber mais, inclusive

Responder
Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 37/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Eugenio Andrade disse:


14/11/2013 às 4:41 pm

Show de Bola, valeu!!

Adiel França disse:


25/11/2013 às 10:13 am

i ae Diego blz..? Gostei do seu blog, achei muito bom..


Responder

Diego Garcia disse:


26/11/2013 às 4:54 pm

Vlw Adiel

[]’s
Responder

Hemelen disse:
26/11/2013 às 4:51 pm

Olá Diego, fiz a rotina para marcar um Check na grid, entretanto na coluna desejada até forma o quadradinho, mas ao clicar
não dá o Check. O que poderia ser feito?
Responder

Diego Garcia disse:


26/11/2013 às 4:55 pm

Opa Hemelen, tudo bom?


Você implementou a rotina do OnCellClick do DbGrid igual está no post?

[]’s
Responder

Hemelen disse:
26/11/2013 às 6:19 pm

Siiim , mesmo assim não funciona

Flavio disse:
04/12/2013 às 8:40 pm

Olá Diego!!

Veja se pode ajudar-me, por favor.


Tenho uma dbgrid funcionando bem, com botão alterar e excluir, chamando outro formulário.
Preciso que quando altere um campo da tabela no Form Alterar, volte e atualize a coluna da Dbgrid. A Dbgrid e a tabela são
diferentes. Precisei criar uma tabela auxiliar para o dbgrid.
Desde já obrigado pela atenção.
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Abraços…
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies

Flavio
Fechar e aceitar
Responder

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 38/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Leandro disse:
05/12/2013 às 11:38 pm

Ola Diego! Legal seu post, bom tenho uma duvida e espero que consiga me ajudar, estou desenvolvendo um sistema de
gerenciamento de coleta de uma determinada mercadoria, bom existem varias rotas e os clientes que terao a mercadoria
coletada estao divididos em rotas, o que gostaria de fazer e que ao inves de ter que fazer o lançamento de coletas individuais
para cada cliente tendo que lançar a data, funcionario que coletou, etc para cada cliente eu queria montar esses dados num
panel sendo necessario seta-los apenas uma vez, logo abaixo colocaria uma DBGrid e nesta eu traria todos os clientes de
determinada rota, nessa DBGrid teria apenas o nome e um campo para colocar a quantidade da mercadoria coletada, ai
quando eu for inserir no banco eu criaria uma rotina para pegar os dados do panel como data, funcionario, etc e faria um
loop para ir gravando no banco cliente por cliente, nao tenho ideia de como fazer isso, espero ter sido claro, mais uma vez
parabens e obrigado pela atenção.
Responder

DAVID disse:
06/12/2013 às 2:27 pm

Boa tarde.

Amigo gostaria de uma ajuda com o DBgrid. você poderia me add no Skype por favor
AUTORIZADABR
Responder

Josenildo disse:
20/12/2013 às 11:48 am

Olá Diego !,

Preciso de sua ajuda, Estou montando um sistema para restaurante e tenho uma tela de Delivery para entrega de pedidos,
nessa tela tenho um DBGrid que mostra o pedido do cliente e na ultima coluna registra o minuto corrente, sendo assim,
como faço para essa coluna ir registrando cada minuto que se passa para o usuario saber o tempo do pedido ?.

Abraços
Responder

Diego Garcia disse:


20/12/2013 às 11:53 am

Sugiro você usar campos calculados.

[]’s
Responder

Douglas Castro disse:


15/01/2014 às 12:17 pm

Olá Diego, esse foi um post muito prestativo(até favoritei para não perder as dicas acima ) sou apenas um estudante, gostaria
de saber como eu faço pra saber as linhas selecionadas de um DBGrid para poder obter os dados das colunas.
Vlw
Responder
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies

Diego Garcia disse: Fechar e aceitar


17/01/2014 às 3:17 pm

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 39/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Opa Douglas, tudo bom?


Então, quando altera os registros selecionados em um DBGrid, na verdade você está manipulando o ponteiro do
próprio DataSet, ou seja, se você está trabalhando com um ClientDataSet em um DBGrid e você quer manipular os
dados que estão selecionados no momento no DBGrid, bastar ir direto nos fields do ClientDataSet.

[]’s
Responder

Adiel França disse:


17/01/2014 às 3:33 pm

Oi Diego blz?
No caso da linha zebrada vc utilizou a propriedade RecNo do DataSet, se eu estiver utilzando o componente TTable, como
faço?
Responder

Diego Garcia disse:


22/01/2014 às 6:39 pm

Opa mestre, tudo bom? o TTable tem RecNo também, essa propriedade é nativa da classe TDataSet que é de onde
o TTable descende.

abs
Responder

Daniel disse:
29/01/2014 às 7:57 pm

Olá Diego!

Serei repetitivo… Parabéns pelos posts sobre o dbgrid.


Estou procurando algo que talvez você já tenha visto…
Preciso de um efeito degradê nas linhas do dbgrid. Já viu algo parecido?

Valeu!
Responder

Diego Garcia disse:


14/02/2014 às 3:08 pm

Olá Daniel, tudo bem?


Infelizmente nunca vi esse recurso em ação.

[]’s
Responder

Christian Eduardo disse:


07/03/2014 às 3:06 pm

Olá Diego, serei mais uma voz nesse coro de elogios.


Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Tenho
Para saber um base
mais, inclusive sql
sobre quecontrolar
como tem registros
os cookies,ativos
consulteeaqui:
inativos
Políticaque é informado
em cada registro. Coloquei essa base em um dbgrid de
de cookies
modo que eu possa selecionar o “cliente” que quero. acontece que eu gostaria que os “clientes inativos” aparecessem no grid,
porém mesmo que clicasse em cima dele o registro estaria desabilitado. Sabe de algo parecido? Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 40/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia
Responder

Diego Garcia disse:


07/03/2014 às 4:43 pm

Olá Christian, obrigado pelo feedback.


Sobre o seu caso, você está permitindo edições diretamente no DBGrid?

[]’s
Responder

Diego disse:
18/03/2014 às 9:36 pm

Parabéns pelo post Diego,


aproveitando seu conhecimento, gostaria de saber como atualizar um atributo diretamente na grid, tenho uma tabela com o
atributo valor, estou usando data module, sqldatasete, dadaseteprovide e clientedataset, gostaria de alterar o atributo valor
diretamente na grid, então adicionei o seguinte codigo no evento do beforepost do dataset

if DM.cdsValor.State in [dsEdit, dsInsert] then


begin
DM.cdsValor.Post;
DM.cdsValor.ApplyUpdates(0);
end;

Porém quando dou um tab para sair da célula, entre em loop este evento e da erro over stack, saberia me dizer como alterar
diretamente o atributo na grid?
Responder

Diego Garcia disse:


19/03/2014 às 10:58 am

Olá Diego como vai?

Talvez, o código DM.cdsValor.Post seja desnecessário, digo isso por que o DBGrid já deve repassar o POST para o
seu DataSource, mas é só um palpite.
Responder

Dunier disse:
01/05/2014 às 12:29 pm

Olá Diego Garcia, sou novato em programação, mas estou tentando programar em um dos meus projetos ocultar as linhas do
DBGrid em tempo de execução, deixando ele liso mostrando os dados porem sem linhas verticais e horizontais. Este mesmo
efeito eu consigo em propertiens —>options—>dgColLines e dgRowLines. Se puder me ajudar fico muito agradecido.
Responder

Diego Garcia disse:


02/05/2014 às 10:53 am

Opa Dunier, tudo bom?


tente algo assim:
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies
procedure TForm1.ConfigurarDBGrid();
begin Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 41/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

DBGrid1.Options := [dgColLines, dgRowLines];


end;

[]’s
Responder

Dunier disse:
03/05/2014 às 4:27 pm

Opa Diego, não avancei ainda, esta função consta do help e eu já havia testado sem sucesso. continuarei
estudando esse assunto e muito obrigado por seu tempo gasto em me responder. vlw…

johnatan disse:
08/06/2014 às 12:15 am

ola Diego PARABENS pelo post e pela Atenção a Todos,mas estou com um problema q esta me atormentando,tenho uma
tabela com produtosTABLE1 e dependendo da quantidade de produtos uma campo calculado chamado “STATUS” recebe os
valores:ESTAVEL,BAIXO ou CRITICO…minha dificuldade e que ao realizar um filtro no campo calculado ele da Erro,sera
que existe alguma maneira de filtrar campos calculados?

Abaixo minha tentativa Mal sucedida

procedure TForm1.Edit1Change(Sender: TObject);

begin

TABLE1.Filtered := False;
if (Edit1.Text ”) then

begin

TABLE1.Filter := ‘status=’ +QuotedStr(Edit1.text + ‘*’);


TABLE1.Filtered := True;
TABLE1.locate(‘status’,Edit1.text,[loCaseInsensitive, loPartialKey]);

Meu E-mail: Johnatan.ios@hotmail.com

Aguardo sua Resposta…Vllw


Responder

Diego Garcia disse:


09/06/2014 às 3:19 pm

Olá Johnatan, obrigado pelo feedback, sobre a sua duvida, realmente não existe filtro em campos calculados, tente
usar um TClientDataSet ligado a TDataSetProvider e faça os filtros no TClientDataSet, talvez funcione.

[]’s
Responder

Rodrigo Alves disse:


09/06/2014 às 11:03 am

Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Bom dia Diego, estou iniciando em Delphi, e usei as suas dicas, porém quando clico na coluna a qual quero que seja feita a
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies
ordenação recebo o seguinte erro.
“Project PTeste.exe raised exception clas $C0000005 whith message ‘access violation at 0×00000365: read ofFechar e aceitar
address
’0×00000365′ ”
https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 42/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

E me indica que o erro se encontra na procedure abaixo:


procedure TCustomClientDataSet.SetIndexFieldNames(const Value: string);
begin
SetIndex(Value, Value ”);
end;

Poderia me ajudar a solucionar?


Abraço!
Tens ajudado bastante em meu aprendizado!
Responder

Diego Garcia disse:


09/06/2014 às 3:20 pm

Olá Rodrigo, tudo bom?


Teria como vc postar sua unit (ou talvez parte dela) para ficar mais claro o problema? só com esse trecho de código
está um pouco nebulosa a questão.
[]’s
Responder

Luiz Fernando disse:


27/06/2014 às 6:39 pm

Caro Diego,
Tenho um DbGrid, mas estou querendo que quando der duplo clique na linha apareça a tela de atualizao de cadastro.
Responder

Diego Garcia disse:


15/07/2014 às 10:11 am

Olá Luiz, você pode utilizar o evento DbClick do DBGrind.


[]’s
Responder

watson disse:
14/07/2014 às 9:58 pm

Diego, Parabens…por favor vc pode me ajuda ? Tenho alguns edits e quando o usuario efetua o cadastro quero que esses
registro vão para o Dbgrid em tempo de execução. Pois hoje eu tenho que fechar e abri o programa para atualizar… eu uso
clientdataset, sqlquery,etc… No Aguardo Obrigado
Responder

Diego Garcia disse:


15/07/2014 às 10:10 am

Olá Watson, você está utilizando o ApplyUpdate ?


Responder

watson disse:
15/07/2014 às 10:57 am
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies
Olá Diego, estou não ! Cheguei a utilizar duas formas a 1º deu certo mas não gostei é de colocar
clientdataset.refresh no componente Timer, mas essa opção chega travar o sistema. A outra tentei mas
Fechar não
e aceitar
deu certo segue abaixo.

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 43/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Unit2.Insert;
begin

DataModule1.ClientDataSet1.Active := true;
DataModule1.ClientDataSet1.Close;
DataModule1.ClientDataSet1.CommandText := ‘select * from transporte’;
DataModule1.ClientDataSet1.Open;

Esse comando está no botão

watson disse:
17/07/2014 às 1:44 pm

Diego ? você pode me ajudar ? Abraço


Responder

Odirlei disse:
01/08/2014 às 9:22 am

Diego, preciso da sua ajuda!


Seguinte, tenho um clientDataSet que é uma tabela de memória, nela coloco dados que vem do banco de dados, logo, tenho
um campo chamado “selecionado” o mesmo nome que vc colocou no seu exemplo, porém estou tentando colorir a linha
quando o checkbox do grid for marcado, mas não estou conseguindo, pois além de não montar o checkbox na coluna só
aparece a cor quando clico na coluna e mesmo assim não marca a linha, somente a célula da coluna “selecionado”. Segue
abaixo o meu código na coluna:

procedure TfFipr1300.GridListaDrawColumnCell(Sender: TObject;


const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
var
Check: Integer;
R: TRect;
begin
if cds_lista.RecordCount > 0 then
begin
with GridLista do
begin
if AnsiLowerCase(Column.FieldName) = ‘selecionado’ then
begin
Canvas.FillRect(Rect);
Check := 0;
if cds_listaselecionado.AsString = ‘S’ then
begin
Check := DFCS_CHECKED;
Canvas.Brush.Color:=cl3DLight;
end
else
Canvas.Brush.Color:=clWhite;
R:=Rect;
InflateRect(R,-2,-2); {Diminue o tamanho do CheckBox}
DefaultDrawDataCell(Rect, Column.field, State);
end;
end;
end;
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies
end;
Responder Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 44/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

Odirlei disse:
01/08/2014 às 10:37 am

já resolvi, mesmo assim, obrigado


Responder

Casanova disse:
29/08/2014 às 1:26 am

Ola. Parabéns. Facilitou bastante.


Gostaria de saber como faço para colorir entre três valores ou datas três datas. Estou trabalhando com prazos processuais e
quero deixar os vencimentos em alertas. Exemplo. entre <= data+2 cor vermelha, entre a data anterior data+2 até ,<= data+5
amarelo e depois o else para o restante.em verde. Carlos
Responder

eduardo cruz disse:


08/10/2014 às 1:50 pm

Boa Tarde Diego, parabéns pelos tutoriais, sou mais um que estou precisando do seu conhecimento, estou desenvolvendo
para uma cliente um sistema de cupom fiscal, mas não estou conseguindo pegar os dados dos itens que são lançados em em
dbgrid, preciso pegar os dados tipo código item, descrição, quant., Unidade, valor, e enviar para a impressora fiscal, estou
usando impressora daruma e a dll daruma framemework, fiz um teste em edits e deu certo só não consegui mesmo foi enviar
do dbgrid, desde já agadeço.

ass: eduardo
Responder

Diego Garcia disse:


08/10/2014 às 2:25 pm

Opa Eduardo tudo bom? O segredo é recuperar os itens do armazenamento onde o DBGrid está ligado, por
exemplo um ClientDataSet, depende de como você projetou a solução.

[]’s
Responder

eduardo cruz disse:


08/10/2014 às 3:15 pm

estou usando dbgrid conectando dsvendasitem q se conecta com DMDados.ZQRVendaItem


eu fiz assim mas não está dando, certo

Str_Aliquota := AnsiString(DBGItensVenda.SelectedField.DataSet.FieldByName(‘p_aliquota’).AsString);
Str_Qtde := AnsiString(DBGItensVenda.SelectedField.DataSet.FieldByName(‘vi_quantidade’).AsInteger);
Str_ValorUnit := AnsiString
(FloatToStr(DBGItensVenda.SelectedField.DataSet.FieldByName(‘vi_valor’).AsFloat));
Str_Codigo_Item :=
AnsiString(DBGItensVenda.SelectedField.DataSet.FieldByName(‘vi_produto’).AsInteger);
Str_UnidadeMedida :=
AnsiString(DBGItensVenda.SelectedField.DataSet.FieldByName(‘p_unidade’).AsString);
Str_Descricao := AnsiString(DBGItensVenda.SelectedField.DataSet.FieldByName(‘p_nome’).AsString);

Privacidade e cookies: Esse siteInt_Retorno :=continuar


utiliza cookies. Ao iCFVenderSemDesc_ECF_Daruma(Str_Aliquota,
a usar este site, você concorda com seu uso. Str_Qtde, Str_ValorUnit,
Str_Codigo_Item,
Para saber mais, inclusive sobre Str_UnidadeMedida,
como controlar os cookies, consulte aqui: Política deStr_Descricao);
cookies

Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 45/46
11/09/2018 Dicas sobre o componente DBGrid do Delphi | Diego Garcia

eduardo cruz disse:


08/10/2014 às 2:45 pm

estou usando dbgrid conectando dsvendasitem q se conecta com DMDados.ZQRVendaItem


eu fiz assim mas não está dando, certo

Str_Aliquota := AnsiString(DBGItensVenda.SelectedField.DataSet.FieldByName(‘p_aliquota’).AsString);
Str_Qtde := AnsiString(DBGItensVenda.SelectedField.DataSet.FieldByName(‘vi_quantidade’).AsInteger);
Str_ValorUnit := AnsiString (FloatToStr(DBGItensVenda.SelectedField.DataSet.FieldByName(‘vi_valor’).AsFloat));
Str_Codigo_Item := AnsiString(DBGItensVenda.SelectedField.DataSet.FieldByName(‘vi_produto’).AsInteger);
Str_UnidadeMedida := AnsiString(DBGItensVenda.SelectedField.DataSet.FieldByName(‘p_unidade’).AsString);
Str_Descricao := AnsiString(DBGItensVenda.SelectedField.DataSet.FieldByName(‘p_nome’).AsString);

Int_Retorno := iCFVenderSemDesc_ECF_Daruma(Str_Aliquota, Str_Qtde, Str_ValorUnit, Str_Codigo_Item,


Str_UnidadeMedida, Str_Descricao);
Responder

Hélio disse:
10/10/2014 às 1:09 pm

Diego tem como ordenar o dbgrid em ASC e DESC quando clicar no mesmo título ele mudar para ASCendente e outro Clik
para DESCendente?
Responder

José Raimundo disse:


06/12/2014 às 9:33 pm

Diego boa Noite.


Gostaria uma dica, como faço para imprimir registro só o que estive selecionado no DBgrid.
Trabalho com Interbase e Firebird e uso uma query para fazer a pesquisa.
Desde já agradeço pela dica.
José Raimundo
Responder

Vanessa disse:
05/01/2015 às 10:10 am

Olá. Como eu poderia colocar um combobox na grid que pegasse dados gravados no banco de dados?
Responder

ANTONIO EUDES DE A. LIMA disse:


03/03/2015 às 11:44 am

Diego, preciso ver dados texto contidos num campo blob, em uma tabela dbgrid. Pode me orientar? Obrigado. Eudes.
Responder

Diego Garcia
Blog no WordPress.com.

Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso.
Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies

Fechar e aceitar

https://drgarcia1986.wordpress.com/2013/01/17/dicas-sobre-o-componente-dbgrid-do-delphi/ 46/46

Você também pode gostar