ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

DbGrid com CheckBox usando query?

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
Mazo1
Aprendiz
Aprendiz


Registrado: Domingo, 3 de Janeiro de 2010
Mensagens: 256
Localização: Alagoas

MensagemEnviada: Dom Mar 22, 2020 2:32 am    Assunto: DbGrid com CheckBox usando query? Responder com Citação

Pessoal depois de passar dois dias pesquisando sobre esse problema, não consegui encontrar nenhuma dica que resolvesse essa questão, encontrei vários exemplos que funcionam com clientdataset, mas uso os componentes da paleta interbase, meu objetivo é criar um checkbox no dbgrid sem gravar no banco e depois pegar apenas uma linha onde está o check. Consegui desenhar certinho o checkbox com o código abaixo, mas habilitar o checkbox é outra história.

Código:
 procedure TFrmProgressao.DBGridConsultaDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  Check: Integer;
  R: TRect;
begin
  //Desenha um checkbox no dbgrid
  if Column.FieldName = 'ATIVO' then begin
     DBGridConsulta.Canvas.FillRect(Rect);
     Check := 0;
  if IBQryConsultaATIVO.AsString = 'X' then
     Check := DFCS_CHECKED
  else Check := 0;
     R:=Rect;
     InflateRect(R,-2,-2); {Diminue o tamanho do CheckBox}
     DrawFrameControl(DBGridConsulta.Canvas.Handle,R,DFC_BUTTON, DFCS_BUTTONCHECK or Check);
end;

end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mazo1
Aprendiz
Aprendiz


Registrado: Domingo, 3 de Janeiro de 2010
Mensagens: 256
Localização: Alagoas

MensagemEnviada: Seg Mar 23, 2020 12:48 am    Assunto: Responder com Citação

Amigos depois de mais pesquisas e algumas alterações consegui melhorar o código, fiz da seguinte forma: criei uma coluna (ATIVO) no banco do tipo integer, fiz um upadate na mesma inserindo apenas o número 1, na query no fields editor defini ATIVOS no FieldKind para fkCalculated, funcionou beleza, a única questão é que permite habilitar mais de um Chekcbox, peço ajuda dos senhores para habilitar apenas 1.

Código:
procedure TFrmProgressao.DBGridConsultaDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
Check: Integer;
R: TRect;
begin
//Desenha um checkbox no dbgrid
  if Column.FieldName = 'ATIVO' then
    begin
      DBGridConsulta.Canvas.FillRect(Rect);
      Check := 0;
  if IBQryConsultaATIVO.AsInteger = 1 then
     Check := DFCS_CHECKED
  else
     Check := 0;
     R:=Rect;
     InflateRect(R,-2,-2); {Diminue o tamanho do CheckBox}
     DrawFrameControl(DBGridConsulta.Canvas.Handle,R,DFC_BUTTON, DFCS_BUTTONCHECK or Check);
    end;
end;



Código:
procedure TFrmProgressao.DBGridConsultaDblClick(Sender: TObject);
begin
 if ((Sender as TDBGrid).DataSource.Dataset.IsEmpty) then
    Exit;

  (Sender as TDBGrid).DataSource.Dataset.FieldByName('ATIVO').AsInteger :=
    IfThen((Sender as TDBGrid).DataSource.Dataset.FieldByName('ATIVO').AsInteger = 1, 0, 1);
 end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Seg Mar 23, 2020 10:45 am    Assunto: Responder com Citação

Dê uma olhada aqui também, tem um exemplo:


http://delphizinho.blogspot.com/2009/02/checkbox-no-dbgrid-do-delphi.html

Num dos meus posts:
http://www.activedelphi.com.br/forum/viewtopic.php?t=93970&sid=5b65c73cd48b5b6904c45749100221e5


bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
Mazo1
Aprendiz
Aprendiz


Registrado: Domingo, 3 de Janeiro de 2010
Mensagens: 256
Localização: Alagoas

MensagemEnviada: Seg Mar 23, 2020 1:16 pm    Assunto: Responder com Citação

Walker, agradeço o contato, mas já tinha visto essas dicas que vc passou, alias não se tem alguma que eu não tenha olhado. No meu caso não uso Clientdataset, só estou precisando percorrer o Dbgrid e evitar que o usuário selecione duas linhas.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Qua Mar 25, 2020 12:31 pm    Assunto: Responder com Citação

Você quer percorrer o dbgrid com as opções marcadas?
No caso da seleção múltipla, marque a opção multiselect para false na propriedade do dbgrid.




Bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
Mazo1
Aprendiz
Aprendiz


Registrado: Domingo, 3 de Janeiro de 2010
Mensagens: 256
Localização: Alagoas

MensagemEnviada: Qua Mar 25, 2020 2:23 pm    Assunto: Responder com Citação

Sim, percorrer com apenas uma linha marcada, quanto ao MultiSelct do dbgrid como False foi a primeira coisa que fiz, mas não obedece.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mazo1
Aprendiz
Aprendiz


Registrado: Domingo, 3 de Janeiro de 2010
Mensagens: 256
Localização: Alagoas

MensagemEnviada: Seg Abr 06, 2020 10:19 pm    Assunto: Responder com Citação

johnny, tentei implantar o código conforme a dica no link sugerido por você, estamos quase chegando ao que preciso. Veja como fiz: criei um campo ATIVO do tipo CHAR e depois um do tipo varchar (nos dois fiz unpate inserindo a letra F), mas nenhum funcionou 100%, mas de qualquer forma só permite selecionar uma linha como eu quero, a questão é que não está habilitando o check ele mostra a letra 'F' ao lado.

Código:

procedure TFrmProgressao.DBGridConsultaColExit(Sender: TObject);
begin
  if DBGridConsulta.SelectedField <> nil then
     if DBGridConsulta.SelectedField.FieldName = DBCheckBox1.DataField then
        DBCheckBox1.Visible := False
end;

procedure TFrmProgressao.DBGridConsultaDblClick(Sender: TObject);
begin
  IBQryTurma.Locate('CODIGO',IBQryConsultaCODIGO_TURMA.AsString,[]);
  IBQryAlunoProgressao.Locate('MATRICULA_ALUNO',IBQryConsultaMATRICULA_ALUNO.AsString,[]);

 end;

procedure TFrmProgressao.DBGridConsultaDrawColumnCell(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 gdSelected in State then
   begin
        Canvas.FillRect(Rect);
        Canvas.Brush.Color := clHighLight;//clBackground; // Cor de seleção
        Canvas.Font.Color  := clHighLightText;//clWhite;//$00FFF2D9;//clYellow;
   end
   else
       inherited;
   DBGridConsulta.DefaultDrawColumnCell(Rect, DataCol, Column, State);

  if (gdFocused in State) then
  begin
    if (Column.Field.FieldName = DBCheckBox1.DataField) then
    begin
     DBCheckBox1.Left := Rect.Left + DBGridConsulta.Left + 2;
     DBCheckBox1.Top := Rect.Top + DBGridConsulta.top + 2;
     DBCheckBox1.Width := Rect.Right - Rect.Left;
     DBCheckBox1.Height := Rect.Bottom - Rect.Top;

     DBCheckBox1.Visible := True;
    end
  end
  else
  begin
     if Column.Field <> nil then
        if (Column.Field.FieldName = DBCheckBox1.DataField) then
        begin
          DrawRect:=Rect;
          InflateRect(DrawRect,-1,-1);

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

          DBGridConsulta.Canvas.FillRect(Rect);
          DrawFrameControl(DBGridConsulta.Canvas.Handle, DrawRect,
                           DFC_BUTTON, DrawState);
        end;
  end;
end;

procedure TFrmProgressao.DBGridConsultaKeyPress(Sender: TObject; var Key: Char);
begin
 if (Key = Chr(9)) then
     Exit;

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


procedure TFrmProgressao.FormCreate(Sender: TObject);
begin
     DBCheckBox1.DataSource := DsConsulta;
     DBCheckBox1.DataField  := 'ATIVO';
     DBCheckBox1.Visible    := False;
     DBCheckBox1.Color      := DBGridConsulta.Color;
     DBCheckBox1.Caption    := '';
     DBCheckBox1.AllowGrayed:= False;
     //explained later in the article
     DBCheckBox1.ValueChecked   := 'V';
     DBCheckBox1.ValueUnChecked := 'F';
end;
[/code]
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mazo1
Aprendiz
Aprendiz


Registrado: Domingo, 3 de Janeiro de 2010
Mensagens: 256
Localização: Alagoas

MensagemEnviada: Qui Abr 09, 2020 6:13 am    Assunto: Responder com Citação

johnny por favor informe que tipo campo você criou?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB