Jump to content
passarito

Check box em tabela

Recommended Posts

passarito

Boas,

Necessito de uma ajuda/esclarecimento...

Tenho um campo booleano que mostro numa tabela TDBGrid

O resultado que obtenho é True/False. Há alguma forma de mostrar essa informação através de check boxes?

Share this post


Link to post
Share on other sites
nunopicado

Sim

Não vás longe que daqui a nada já aqui ponho. :P Essa não sei de cor, mas tenho algures aqui.

Estás em que compilador?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
nunopicado

O bom e velho... :)

Primeiro, tens criar uma dbcheckbox além da dbgrid.

Depois, no OnCreate da form, metes:

DBCheckBox1.DataSource := DataSource1;   // Datasource da dbgrid
DBCheckBox1.DataField  := 'CampoBool';   // Campo da coluna da dbgrid onde queres usar a checkbox
DBCheckBox1.Visible    := False;         // Para começar, escondida
DBCheckBox1.Color      := DBGrid1.Color; // Caso não use a cor standard
DBCheckBox1.Caption    := '';            // Só queres a box, não o texto 

//explained later in the article
DBCheckBox1.ValueChecked := 'True'; 
DBCheckBox1.ValueUnChecked := 'False'; 

Agora é preciso certificar que esta vai aparecer no sitio certo quando for chamada ao trabalho.

No evento OnDrawColumnCell da dbgrid, metes:

procedure TForm1.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 begin 
                 // Se célula seleccionada, mostra a DBCheckBox...
                 if (Column.Field.FieldName = DBCheckBox1.DataField)  // ... desde que a coluna seja a certa
                    then begin
                              // Posiciona a DBCheckBox
                              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;

                              // Torna-a visível
                              DBCheckBox1.Visible := True;
                         end
            end
       else begin
                 // Se a célula não estiver seleccionada...  
                 if (Column.Field.FieldName = DBCheckBox1.DataField)  // ... mas for a coluna certa
                    then begin                              
                              DrawRect:=Rect;
                              InflateRect(DrawRect,-1,-1);                         
                              DrawState := ISChecked[Column.Field.AsBoolean];

                              // Pinta um rectângulo por cima da célula
                              DBGrid1.Canvas.FillRect(Rect);

                              // E desenha uma checkbox a condizer nas células não seleccionadas
                              DrawFrameControl(DBGrid1.Canvas.Handle, DrawRect, DFC_BUTTON, DrawState);
                         end;
            end; 
end;

Ainda temos de esconder a dbcheckbox quando deixa de ser usada.

No OnColExit da DBGrid:

procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
    if DBGrid1.SelectedField.FieldName=DBCheckBox1.DataField 
       then DBCheckBox1.Visible:=False;
end;

Apanhas as teclas e direccioná-las para a DBCheckBox:

procedure TForm1.DBGrid1KeyPress(Sender:TObject; var Key:Char);
begin
    if (key=#9) 
       then Exit;

    if (DBGrid1.SelectedField.FieldName=DBCheckBox1.DataField) 
       then begin
                 DBCheckBox1.SetFocus;
                 SendMessage(DBCheckBox1.Handle,WM_Char,word(Key),0);
            end;
end;

E o toque final:

procedure TForm1.DBCheckBox1Click(Sender: TObject);
begin
    if DBCheckBox1.Checked 
       then DBCheckBox1.Caption:=DBCheckBox1.ValueChecked
       else DBCheckBox1.Caption:=DBCheckBox1.ValueUnChecked;
end;

Isto permite aparecer o valor ao lado da checkbox quando se está a editar.

Testa lá se funciona no D7, mas penso que sim!

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Kline777

Estou tao habituado às da DevExpress que já nem me lembrava que as grelhas nativas nao traziam já colunas desse tipo :P

Share this post


Link to post
Share on other sites
passarito

Obrigado por tudo, mas o trabalhar daquilo está muito inconsistente...

1. Tenho duas BDGrids na Form, para ajudar à festa a que eu necesito é a de baixo....

2. A Form é dinamica... bonito serviço!

3. A tabela tem Scroll vertical, e quando anda para cima e para baixo as Check boxes baralham-se um pouco.

O erro é meu, em usar as grelhas nativas....

Obrigado pelo esforço, mas estou a pensar usar outro método, mais arcaico e menos profissional, mas mais certo.

Uma DBCheckbox por baixo da tabela que apresenta o estado da linha em questão, ou então uma selecção de opção.

mais uma vez obrigado.

Share this post


Link to post
Share on other sites
nunopicado

Acho que há: http://www.scalabium.com/

Dá uma olhada, acho que anda aí qq coisa!


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
passarito

Estou cheio de trabalho, mas vou ver se consigo tirar um bocadinho para fazer os testes adequados!

Depois direi qualquer coisa.

Share this post


Link to post
Share on other sites
Gilson Nunes

Estou cheio de trabalho, mas vou ver se consigo tirar um bocadinho para fazer os testes adequados!

Depois direi qualquer coisa.

no lazarus ja vem nativo. como vc usa delphi 7. uma opção mt usada é a lib JEDI.

http://www.delphi-jedi.org/

  • Vote 1

Share this post


Link to post
Share on other sites
nunopicado

no lazarus ja vem nativo. como vc usa delphi 7. uma opção mt usada é a lib JEDI.

http://www.delphi-jedi.org/

Bem lembrado.

O projecto JEDI tem uma série de componentes melhorados em relação aos nativos, e é quase um faz tudo nessa área.

Não tem o refinamento da DevExpress, mas pelo preço, não somos esquisitos! ;)


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.