Вы находитесь на странице: 1из 5

InfoHome Web Site

CheckBox dentro de um DBGrid


15 de novembro de 2007

Veja como colocar um CheckBox dentro de um DBGrid. Crie interfaces visualmente mais atraentes para edição de
campos booleanos dentro de um DBGrid.
CheckBox em um DBGrid? Para que?

Existem muitas razões possíveis para você querer colocar um campo booleano de um DBGrid como um CheckBox.
Imagine que você esteja desenvolvendo por exemplo um sistema que possua um Form onde você possa listar vários
registros à serem exportados, mas dentre todos somente alguns você pretende exportar.

Daí imagine você colocar em um determinado campo um CheckBox onde você possa selecionar quais os registros que
serão selecionados. Com certeza, será muito mais prático selecionar os registros do que ficar manipulando intruções
SQL ou filtros de registros em tempo de execução!

Por padrão, o DBGrid exibe valores de campos booleanos como "True" ou "False", de acordo com o valor do campo de
dados. Caso você tenha feito alterações no Delphi para tradução de mensagens para o Português, estes campos
também poderão ser apresentados como "Falso" ou "Verdadeiro".
Iniciando a aplicação de exemplo

Com o Delphi aberto, inicie uma nova aplicação contendo em um Form os seguintes componentes:

- Componentes para acesso aos dados;

- DBGrid

- DBNavigator
Ajuste as propriedades de todos os componentes, de forma que você tenha uma aplicação parecida com a imagem
abaixo:

Inserindo o CheckBox no DBGrid

Agora sim! Daqui pra frente iremos melhorar a interface gráfica de nossa aplicação, efetuando a inclusão de um
CheckBox dentro da DBGrid.

Na verdade, iremos inserir o componente TDBCheckBox, uma vez que iremos manipular dados, e para tanto teremos
que utilizar componentes Data-Aware.

O objetivo é fazer com que o DBGrid tenha a aparência como visto na imagem abaixo:

Como fazer? Como funciona?

Todo o procedimento de ajustar o componente dentro da DBGrid será realizado em tempo de execução (Run-Time).
Siga as instruções adiante para entender como funciona e ajustar a sua aplicação.

Insira no Form um componente TDBCheckBox. Ajuste a propriedade Visible deste componente como False.

Em seguida, ajuste as propriedades DataSource e DataField do TDBCheckBox para o acesso aos dados e ao
respectivo campo booleano.

Lembre-se, que você poderá também ajustar estes valores para em tempo de execução no evento OnCreate do Form,
como visto no código abaixo:
http://www.kanenberg.com Fornecido por Joomla! Produzido em: 31 March, 2009, 00:41
InfoHome Web Site

Evento OnCreate do Form

procedure TfrmMain.FormCreate(Sender: TObject);

begin

DBCheckBox1.DataSource := DataSource1;

DBCheckBox1.DataField := 'SELECIONADO';

DBCheckBox1.Visible := False;

DBCheckBox1.Color := DBGrid1.Color;

DBCheckBox1.Caption := '';

// Valores a serem exibidos na edição dos dados

DBCheckBox1.ValueChecked := 'Sim';

DBCheckBox1.ValueUnChecked := 'Não';

end;

Agora que começa a parte mais interessante do projeto, é onde vamos simplesmente desenha do DBCheckBox dentro
da célula do DBGrid.

A maneira mais fácil de conseguir realizar isso é necessário usar a API do Windows. Neste caso usaremos a função
DrawFrameControl.

Veja abaixo o código do evento OnDrawColumnCell da DBGrid, onde iremos realizar o procedimento citado acima.

Evento OnDrawColumnCell da DBGrid

procedure TfrmMain.DBGrid1DrawColumnCell(Sender: TObject;

const Rect: TRect; DataCol: Integer; Column: TColumn;

State: TGridDrawState);

const IsChecked : array[Boolean] of Integer =

(DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);

var

DrawState: Integer;

DrawRect: TRect;

begin

if (gdFocused in State) then


http://www.kanenberg.com Fornecido por Joomla! Produzido em: 31 March, 2009, 00:41
InfoHome Web Site

begin

if (Column.Field.FieldName = DBCheckBox1.DataField) then

begin

DBCheckBox1.Left := Rect.Left + DBGrid1.Left + 2;

DBCheckBox1.Top := Rect.Top + DBGrid1.top + 2;

DBCheckBox1.Width := Rect.Right - Rect.Left;

DBCheckBox1.Height := Rect.Bottom - Rect.Top;

// Tornando o DBCheckBox visível

DBCheckBox1.Visible := True;

end;

end

else

begin

if (Column.Field.FieldName = DBCheckBox1.DataField) then

begin

DrawRect := Rect;

InflateRect(DrawRect,-1,-1);

DrawState := ISChecked[Column.Field.AsBoolean];

DBGrid1.Canvas.FillRect(Rect);

DrawFrameControl(DBGrid1.Canvas.Handle, DrawRect,

DFC_BUTTON, DrawState);

end;

end;

end;

Abaixo segue o código do evento OnColExit, o qual torna o DBCheckBox invisível quando tiramos o foco da célula da
DBGrid:

Evento OnColExit da DBGrid

procedure TfrmMain.DBGrid1ColExit(Sender: TObject);

begin

if DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField then


http://www.kanenberg.com Fornecido por Joomla! Produzido em: 31 March, 2009, 00:41
InfoHome Web Site

DBCheckBox1.Visible := False;

end;

Porém, cabe lebrar que precisamos manipular as condições da célula do DBGrid quando simplesmente apertamos
alguma tecla e/ou clicamos dentro do campo para alterar o seu valor.

Veja o código abaixo, do evento OnKeyPress:

Evento OnKeyPress da DBGrid

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

begin

if (key = Chr(9)) then Exit;

if (DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField) then

begin

DBCheckBox1.SetFocus;

SendMessage(DBCheckBox1.Handle, WM_Char, word(Key), 0);

end;

end;

E, por final ainda vamos aproveitar para um toque final. Vamos aproveitar que as propriedades ValueChecked e
ValueUnChecked do DBCheckBox para mostrar o valor do campo quando clicarmos nele. Para isso, simplesmente
iremos alterar o Caption do DBCheckBox, em run-time.

Veja o código abaixo, do evento OnClick do DBCheckBox:

Evento OnClick do DBCheckBox

procedure TfrmMain.DBCheckBox1Click(Sender: TObject);

begin

if DBCheckBox1.Checked then

DBCheckBox1.Caption := DBCheckBox1.ValueChecked

else

DBCheckBox1.Caption := DBCheckBox1.ValueUnChecked;

end;

http://www.kanenberg.com Fornecido por Joomla! Produzido em: 31 March, 2009, 00:41


InfoHome Web Site

Pronto! Agora já temos um DBCheckBox inserido em nossa DBGrid.

Espero que este artigo seja de muita utilidade e tenha ajudado a tornar a interface de seu sistema com uma aparência
e funcionalidades bem legais.

Leia também.:

- CheckBox dentro de um DBGrid utilizando Firebird

- Tratando DBGrid com cores e imagens

- Exibir relógio no caption do form

- Criando um componente TSQLComboBox

{quickdown:19}

Gostaria de colaborar com algum artigo?

Envie, que publicaremos!

http://www.kanenberg.com Fornecido por Joomla! Produzido em: 31 March, 2009, 00:41

Вам также может понравиться