Simular CheckBox no DBGrid, sempre foi algo muito trabalhoso,
mas existe uma jeito simples e rápido de fazer essa simulação.
Adicione no formulário um: TDBGrid,TDataSource e
Adicione no formulário um: TDBGrid,TDataSource e
TClientDataSet.
-> O TDataSource e o TClientDataSet ambos estão na paleta Data Access.
-> O TDBGrid está na paleta Data Controls.
No DBGrid1, para fazer a ligação dele com o DataSource, em Propriedade faça:
-> DataSource = DataSource1
Para desativar o modo Edição no DBGrid, na Propriedade Options faça:
-> dgEdition = False
No DataSource1, para fazer ligação dele com o ClientDataSet, em Propriedade faça:
-> DataSet = ClientDataSet1
No ClientDataSet1, faça:
-> dê um duplo clique no ClientDataSet1, ou clique com o botão direito do mouse, e escolha a opção Fields Editor ...
Uma janela será aberta.
Na parte vazia (em branco) clique com o botão direito do mouse, e escolha a opção NewField.
Crie um campo com as seguintes características:
Tipo (type): StringTamanho (size): 1
Nome (name): ATIVO
Após o preenchimento, clique em OK, e em seguida feche a janela, onde o campo ATIVO está
aparecendo.
Para Ativar o ClientDataSet:
-> clique com o botão direito do mouse em ClientDataSet, e clique em Create DataSet.
-> na Propriedade Active coloque como True.
Se todos os procedimentos acima tiverem sido seguidos, nesse momento o campo ATIVO, já aparecerá no DBGrid.
Em Eventos do DBGrid siga as instruções abaixo.
-> O TDataSource e o TClientDataSet ambos estão na paleta Data Access.
-> O TDBGrid está na paleta Data Controls.
No DBGrid1, para fazer a ligação dele com o DataSource, em Propriedade faça:
-> DataSource = DataSource1
Para desativar o modo Edição no DBGrid, na Propriedade Options faça:
-> dgEdition = False
No DataSource1, para fazer ligação dele com o ClientDataSet, em Propriedade faça:
-> DataSet = ClientDataSet1
No ClientDataSet1, faça:
-> dê um duplo clique no ClientDataSet1, ou clique com o botão direito do mouse, e escolha a opção Fields Editor ...
Uma janela será aberta.
Na parte vazia (em branco) clique com o botão direito do mouse, e escolha a opção NewField.
Crie um campo com as seguintes características:
Tipo (type): StringTamanho (size): 1
Nome (name): ATIVO
Após o preenchimento, clique em OK, e em seguida feche a janela, onde o campo ATIVO está
aparecendo.
Para Ativar o ClientDataSet:
-> clique com o botão direito do mouse em ClientDataSet, e clique em Create DataSet.
-> na Propriedade Active coloque como True.
Se todos os procedimentos acima tiverem sido seguidos, nesse momento o campo ATIVO, já aparecerá no DBGrid.
Em Eventos do DBGrid siga as instruções abaixo.
Para Desenhar o CheckBox no DBGrid (use o procedimento DrawColumnCell do DBGrid):
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
Check: Integer;
R: TRect;
begin
//Desenha um checkbox no dbgrid
if Column.FieldName = 'ATIVO' then begin
DBGrid1.Canvas.FillRect(Rect);
Check := 0;
if ClientDataSet1Ativo.AsString = 'X' then
Check := DFCS_CHECKED
else Check := 0;
R:=Rect;
InflateRect(R,-2,-2); {Diminue o tamanho do CheckBox}
DrawFrameControl(DBGrid1.Canvas.Handle,R,DFC_BUTTON, DFCS_BUTTONCHECK or Check);
end;
end;
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
Check: Integer;
R: TRect;
begin
//Desenha um checkbox no dbgrid
if Column.FieldName = 'ATIVO' then begin
DBGrid1.Canvas.FillRect(Rect);
Check := 0;
if ClientDataSet1Ativo.AsString = 'X' then
Check := DFCS_CHECKED
else Check := 0;
R:=Rect;
InflateRect(R,-2,-2); {Diminue o tamanho do CheckBox}
DrawFrameControl(DBGrid1.Canvas.Handle,R,DFC_BUTTON, DFCS_BUTTONCHECK or Check);
end;
end;
Para executar ação TRUE ou FALSE no CheckBox (use o procedimento CellClick do DBGrid):
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
ClientDataSet1.Edit;
if ClientDataSet1Ativo.AsString = 'X' then
ClientDataSet1Ativo.AsString := ''
else ClientDataSet1Ativo.AsString := 'X';
ClientDataSet1.Post;
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
ClientDataSet1.Edit;
if ClientDataSet1Ativo.AsString = 'X' then
ClientDataSet1Ativo.AsString := ''
else ClientDataSet1Ativo.AsString := 'X';
ClientDataSet1.Post;
end;
Programa executando:
*********************************************************************************
*********************************************************************************
Faça o download do arquivo: CheckBox no DBGrid.rar
(acompanha arquivo: midas.dll -> necessária para o funcionamento)
*********************************************************************************
"Bem feito é melhor do que bem explicado." Benjamim Franklin.
(acompanha arquivo: midas.dll -> necessária para o funcionamento)
*********************************************************************************
"Bem feito é melhor do que bem explicado." Benjamim Franklin.
34 comentários:
Boa dica, me ajudou muito em um projeto, valeu!
Me ajudou muito também obrigado ....
ótima dica
valeu
Muito boa essa dica...
até agora a maneira mais simples que já vi para colocar um ChechBox em um DBGrid.
Valeu!
mtooo boa a dica !!! perfeito !
valeu ... muito obrigado pela dica...
odair
Obrigado amigo! Muito útil sua dica!
Muito boa a dica, meus parabéns pela iniciativa.
Perfeito!! Código limpo e simples. Muito claro. Parabéns. Valeu mesmo!
Olá amigo, muito bom mesmo. Obrigado. Eu ainda entou procurando como imprimir estas linha selecionada clicando num botao para visualizar e na janela imprimir. c_poeta@hotmail.com
graaaande dica !!
Vlw cara!!! Ajudou mto!
Há várias formas indicadas para colocar um CheckBox no DBGrid. Nenhuma tão simples e funcional como esta. Parabéns
Parabéns amigo a muito tempo estava precisando. Já tinha até desistido, você foi minha salvação
Obrigada pela Dica! Parabéns!
grande diga amigo!!! às vezes bate aquele esquecimento e "pouca voia" de fazer...aí vem o google e nos ajuda!!!
Grato amigo
Obrigado pela ajuda!
Boa tarde!
Fiz o exemplo acima no Delphi 5, porém no lugar do título da coluna aparece o CheckBox. Alguém poderia me ajudar a corrigir isso?
Obrigado.
Parabens, muito bom.
Cara, eu fiz algo semelhante a isso ! Só que eu uso uma TMyQuery para fazer uma consulta e preencher a DBGrid. A configuração é a seguinte:
DBGrid -> DataSource -> ClientDataSet-> DataSetProvider - TMyqyery. Ele preenche a Grid sem problemas, o problema ocorre quando que tento limpar a DBGrid, já tentei de tudo ! Até consegui limpar, so que depois eu tento fazer novamente a consulta ele não preenche a DBGrid, como se o ClientDataSet não estivesse funcionando mais. Como eu faço para limpar os dados dessa Grid e poder fazer outra consultar e preenche-la com outros dados novamente ?
Véi, vlw. Parabéns...
Isso funciona no delphi 7? porque tentei de tudo quanto é jeito, e não funciona, quando eu clico o CheckBox some.. :/ se alguem puder me ajudar..
Usei no Delphi 7 funcionou muito bem. Eu usei no lugar do TClientDataSet uma Tabela de Memoria TMemoryTable.
Parabéns, codigo simples e muito funcional
continue assim.
abraços.
Mário Sergio
Perfeito... muito bom seu post me ajudou muito.
Obrigado!!
Excelente ... era exatamente o que eu precisava. Marcelo
perfeito mais simples impossivel, me quebrou um galhão da poxa de tão grande
Muito bom mesmo... de todos que testei, esse foi o único que cumpriu o objetivo desejado...
top demais!!!ajudou bastante!!!
obrigado
O Melhor e mais resumido que já vi
Muito obrigado amigo por compartilhar essa dica!
Solução super simples porém 100% funcional!
tenho dois campos por exemplo valor1, valor2 preciso que o usuario clique no que ele quizer como faria isso ? pois criei os dois campos na tabela mais nao sei como selecionar um de cada no cellclick.
Cara, muito obrigado.
Nota 10 resolveu. Obrigado por compartilhar
Postar um comentário