Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

passarito

Check box em tabela

Mensagens Recomendadas

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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Editado por 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
passarito

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

Depois direi qualquer coisa.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.