Ir para o conteúdo
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
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.