 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
Mazo1 Aprendiz

Registrado: Domingo, 3 de Janeiro de 2010 Mensagens: 256 Localização: Alagoas
|
Enviada: Dom Mar 22, 2020 2:32 am Assunto: DbGrid com CheckBox usando query? |
|
|
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 |
|
 |
Mazo1 Aprendiz

Registrado: Domingo, 3 de Janeiro de 2010 Mensagens: 256 Localização: Alagoas
|
Enviada: Seg Mar 23, 2020 12:48 am Assunto: |
|
|
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 |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
|
Voltar ao Topo |
|
 |
Mazo1 Aprendiz

Registrado: Domingo, 3 de Janeiro de 2010 Mensagens: 256 Localização: Alagoas
|
Enviada: Seg Mar 23, 2020 1:16 pm Assunto: |
|
|
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 |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Qua Mar 25, 2020 12:31 pm Assunto: |
|
|
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 |
|
 |
Mazo1 Aprendiz

Registrado: Domingo, 3 de Janeiro de 2010 Mensagens: 256 Localização: Alagoas
|
Enviada: Qua Mar 25, 2020 2:23 pm Assunto: |
|
|
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 |
|
 |
Mazo1 Aprendiz

Registrado: Domingo, 3 de Janeiro de 2010 Mensagens: 256 Localização: Alagoas
|
Enviada: Seg Abr 06, 2020 10:19 pm Assunto: |
|
|
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 |
|
 |
Mazo1 Aprendiz

Registrado: Domingo, 3 de Janeiro de 2010 Mensagens: 256 Localização: Alagoas
|
Enviada: Qui Abr 09, 2020 6:13 am Assunto: |
|
|
johnny por favor informe que tipo campo você criou? |
|
Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|