Como colocar um CheckBox em uma coluna do DBGrid?
Algumas vezes temos uma lista de dados onde desejamos selecionar alguns itens. Uma forma elegante é colocando uma coluna com CheckBox, para que o usuário possa marcar o que desejar.
Mas como fazer isso se uso de componentes de terceiros?
Existe duas formas:
Caso o seu Field do seu dataset for do tipo Boolean, o DBGrid irá montar automaticamente o checkbox na coluna.
Para os demais casos, podemos colocar um código que faça isso.
Lembre de declarar Math na seção uses.
1º Etapa – desenhar os check boxes no dbgrid.
No evento OnDrawColumnCell do DBGrid.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
Check: Integer;
R: TRect;
begin
inherited;
if ((Sender as TDBGrid).DataSource.Dataset.IsEmpty) then
Exit;
// Desenha um checkbox no dbgrid
if Column.FieldName = 'SELECAO' then
begin
TDBGrid(Sender).Canvas.FillRect(Rect);
if ((Sender as TDBGrid).DataSource.Dataset.FieldByName('SELECAO').AsInteger = 1) then
Check := DFCS_CHECKED
else
Check := 0;
R := Rect;
InflateRect(R, -2, -2); { Diminue o tamanho do CheckBox }
DrawFrameControl(TDBGrid(Sender).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
inherited;
if ((Sender as TDBGrid).DataSource.Dataset.IsEmpty) then
Exit;
// Desenha um checkbox no dbgrid
if Column.FieldName = 'SELECAO' then
begin
TDBGrid(Sender).Canvas.FillRect(Rect);
if ((Sender as TDBGrid).DataSource.Dataset.FieldByName('SELECAO').AsInteger = 1) then
Check := DFCS_CHECKED
else
Check := 0;
R := Rect;
InflateRect(R, -2, -2); { Diminue o tamanho do CheckBox }
DrawFrameControl(TDBGrid(Sender).Canvas.Handle, R, DFC_BUTTON,
DFCS_BUTTONCHECK or Check);
end;
end;
Neste exemplo foi utilizado um field de nome SELECAO,
onde é testado o mesmo.
Caso o seu valor seja 1, desenha um check marcado,
senão é desenhado um check desmarcado.
2º Etapa – Código para marcar ou desmarcar o Checkbox.
No Evento OnDblClick do DbGrid, é necessário um código
para atualizar o dataset que está vinculado ao datasource do dbgrid.
1
2
3
4
5
6
7
8
9
10
11
12
| procedure TForm1.DBGrid1DblClick(Sender: TObject);
begin
if ((Sender as TDBGrid).DataSource.Dataset.IsEmpty) then
Exit;
(Sender as TDBGrid).DataSource.Dataset.Edit;
(Sender as TDBGrid).DataSource.Dataset.FieldByName('SELECAO').AsInteger :=
IfThen((Sender as TDBGrid).DataSource.Dataset.FieldByName('SELECAO').AsInteger = 1, 0, 1);
(Sender as TDBGrid).DataSource.Dataset.Post;
end; |
procedure TForm1.DBGrid1DblClick(Sender: TObject);
begin
if ((Sender as TDBGrid).DataSource.Dataset.IsEmpty) then
Exit;
(Sender as TDBGrid).DataSource.Dataset.Edit;
(Sender as TDBGrid).DataSource.Dataset.FieldByName('SELECAO').AsInteger :=
IfThen((Sender as TDBGrid).DataSource.Dataset.FieldByName('SELECAO').AsInteger = 1, 0, 1);
(Sender as TDBGrid).DataSource.Dataset.Post;
end;
Lembrando que neste exemplo foi feito uso da função IfThen que está disponível na unit Math do Delphi.
Como este código é para você ter um DBGrid funcionando com CheckBox muito bem.
Para ajudar no entendimento, asista a explicação do exemplo.
Se preferir, podes fazer o download dos fontes do exemplo.
Download “Exemplo CheckBox no DBGrid”
CheckDBGrid.zip – Baixado 277 vezes – 7,90 KB
Qualquer dúvida, poste comentários no post.
Aquele abraço.
-
Giovani Da Cruz
-
24.103 views
- 6 comentários
- 11 de novembro de 2016
Está gostando do conteúdo? Considere pagar um cafezinho para nossa equipe!
Posts Relacionados - Continue Aprendendo
Como comentado por Ivan Cezar no grupo no skype,o IfThen para string está localizado na unit System.StrUtils. Então acredito se der uses da unit, o código já irá funcionar com string também.
Muito obrigado pela ajuda , parabens
Eu Uso Firebird como Fazer isso com o banco Firebird?
Como faço para não exibir a numeração apenas o check?
Uma forma é alinhar o texto da coluna ao centro, dai o check acaba o cobrindo.
Muito bom