Fórum Utilizar um CheckBox para realizar Multiselect no DBGrid #276759
12/04/2005
0
estou precisando colocar na primeira coluna de um DBGrid um checkbox para realizar a multiseleção de registros no mesmo.
já possuo um componente DBGRid que tem a opção de exibir um check para campos boolean..
então criei um campo calculaod na tabela do tipo boolean
no Options do grid esta ativado o multiselect,
mas como faço para conseguir marcar multiplos campos pelo checkbox
e depois ver quais estão selecionados?
obrigado
Diogo
Diogoalles
Curtir tópico
+ 0Posts
12/04/2005
Cabelo
Conheço esta opção no infopower..
tente pesquisar em :
http://www.katalogo.com.br/Fornecedores/Fornecedores.asp?dept_id=49
talvez possa te ajudar
Gostei + 0
12/04/2005
Macario
Porque no caso voce esta com as duas opções!
No que se aplicaria a multiseleção?
Gostei + 0
12/04/2005
Diogoalles
preciso selecionar vários registros, onde cada registro terá um checkbox (que não é um campo do meu banco de dados), por isso pensei em criar um campo calculado...
o caso acima é como se o multiselect do grid estivesse ativo e vc pressionasse o CTRL+registro para ir selecionado os registros que vc quer, ao invés disto tenho que permitir ao usuario marcar os varios registros através d um checkbox
espero ter deixado mais claro
se tiverem alguma dica manda ver
abraço
Diogo
Gostei + 0
12/04/2005
Macario
O que você fara com os registros selecionados?
Qual esta sendo sua real dificuldade?
Para marcar os registros use o evento [b:e597c9386a]OnCellClick[/b:e597c9386a] do DbGrid
Testando a Coluna usando a variavel [b:e597c9386a]Column[/b:e597c9386a]
Tente algo assim por exemplo
procedure TForm1.DBGrid1CellClick(Column: TColumn); begin if Column = 0 then begin Tabela1.Edit; if not Tabela1CampoBoolean.AsBoolean then Tabela1CampoBoolean.AsBoolean := true else Tabela1CampoBoolean.AsBoolean := false Tabela1.Post; end; end;
Gostei + 0
12/04/2005
Diogoalles
a função que voce passou não funciona porque ela necessita ter um campo boolean no banco de dados...
eu não tenho esse campo no banco, por isso criei um campo calculado e estou tentando achar a solução através dele...
já utlizei outra rotina no Cellclick que tb não funcionou.. talvez achar uma maneira de relacionar com o campo calculado poderia ser a alternativa, mas não estou conseguindo.
agradeço pela ajuda e se tiverem qq dica por favor me passem
abraço
Diogo
Gostei + 0
12/04/2005
Macario
Se for poderia usar um campo ´temporario´ de qualquer tipo, para simular um boolean e assim usar da forma como lhe passei, pois eu a uso normalmente.
Gostei + 0
12/04/2005
Diogoalles
Tenho muitos programas e não teria como mudar agora.. por isso ainda bato na tecla de criar um campo calculado do tipo boolean...
só que pra dizer qdo ele é true ou false é que não estou conseguindo
com certeza o CalcFileds estara relacionado ao CellClick só que não to conseguindo
valeu
Diogo
Gostei + 0
12/04/2005
Edilcimar
If DBGrid1.SelectedRows.Count > 0 then
Begin
J := DBGrid1.SelectedRows.Count;
NumeroVendedor := VarArrayCreate([1,J], VarInteger);
VendaVista := VarArrayCreate([1,J], VarCurrency);
VendaCartao := VarArrayCreate([1,J], VarCurrency);
VendaCheque := VarArrayCreate([1,J], VarCurrency);
VendaDuplicata := VarArrayCreate([1,J], VarCurrency);
VendaPrazo := VarArrayCreate([1,J], VarCurrency);
Cortesia := VarArrayCreate([1,J], VarCurrency);
Desconto := VarArrayCreate([1,J], VarCurrency);
Total := VarArrayCreate([1,J], VarCurrency);
For I := 1 to J do
Begin
VendaVista[I] := 0;
VendaCartao[I] := 0;
VendaCheque[I] := 0;
VendaDuplicata[I] := 0;
VendaPrazo[I] := 0;
Cortesia[I] := 0;
Desconto[I] := 0;
Total[I] := 0;
End;
J := 1;
With DBGrid1.DataSource.DataSet do
Begin
For I := 0 to DBGrid1.SelectedRows.Count - 1 do
Begin
GotoBookMark(Pointer(DBGrid1.SelectedRows.Items[I]));
J := J + 1;
K := K + 1;
NumeroVendedor[K] := Table1.FieldByName(´NUMERO´).AsInteger;
With Table2 do
Begin
First;
While not eof do
Begin
If FieldByName(´FORMAPAGAMENTO´).AsInteger = 1 then
VendaVista[K] := VendaVista[K] + FieldByName(´VALOR´).AsFloat
Else If FieldByName(´FORMAPAGAMENTO´).AsInteger = 2 then
VendaCartao[K] := VendaCartao[K] + FieldByName(´VALOR´).AsFloat
Else If FieldByName(´FORMAPAGAMENTO´).AsInteger = 3 then
VendaCheque[K] := VendaCheque[K] + FieldByName(´VALOR´).AsFloat
Else If FieldByName(´FORMAPAGAMENTO´).AsInteger = 4 then
VendaDuplicata[K] := VendaDuplicata[K] + FieldByName(´VALOR´).AsFloat
Else If FieldByName(´FORMAPAGAMENTO´).AsInteger = 5 then
VendaPrazo[K] := VendaPrazo[K] + FieldByName(´VALOR´).AsFloat
Else If FieldByName(´FORMAPAGAMENTO´).AsInteger = 6 then
Cortesia[K] := Cortesia[K] + FieldByName(´VALOR´).AsFloat
Else If FieldByName(´FORMAPAGAMENTO´).AsInteger = 7 then
Desconto[K] := Desconto[K] + FieldByName(´VALOR´).AsFloat;
If FieldByName(´FORMAPAGAMENTO´).AsInteger in [1..7] then
Begin
Total[K] := Total[K] + FieldByName(´VALOR´).AsFloat;
Desconto[K] := Desconto[K] + FieldByName(´DESCONTO´).AsFloat;
End;
Next;
End;
End;
End;
End;
End;
If J > 1 then
Begin
With StringGrid1 do
Begin
RowCount := J + 1;
StringGrid1.Cells[0,0] := ´VEND´;
StringGrid1.Cells[1,0] := ´À VISTA´;
StringGrid1.Cells[2,0] := ´CARTÃO´;
StringGrid1.Cells[3,0] := ´CHEQUE´;
StringGrid1.Cells[4,0] := ´DUPLICATA´;
StringGrid1.Cells[5,0] := ´PRAZO´;
StringGrid1.Cells[6,0] := ´CORTESIA´;
StringGrid1.Cells[7,0] := ´DESCONTO´;
StringGrid1.Cells[8,0] := ´TOTAL´;
For I := 1 to K do
Begin
StringGrid1.Cells[0,I] := IntToStr(NumeroVendedor[I]);
StringGrid1.Cells[1,I] := FloatToStr(VendaVista[I]);
StringGrid1.Cells[2,I] := FloatToStr(VendaCartao[I]);
StringGrid1.Cells[3,I] := FloatToStr(VendaCheque[I]);
StringGrid1.Cells[4,I] := FloatToStr(VendaDuplicata[I]);
StringGrid1.Cells[5,I] := FloatToStr(VendaPrazo[I]);
StringGrid1.Cells[6,I] := FloatToStr(Cortesia[I]);
StringGrid1.Cells[7,I] := FloatToStr(Desconto[I]);
StringGrid1.Cells[8,I] := FloatToStr(Total[I]);
TotalVista := TotalVista + VendaVista[I];
TotalCartao := TotalCartao + VendaCartao[I];
TotalCheque := TotalCheque + VendaCheque[I];
TotalDuplicata := TotalDuplicata + VendaDuplicata[I];
TotalPrazo := TotalPrazo + VendaPrazo[I];
TotalCortesia := TotalCortesia + Cortesia[I];
TotalDesconto := TotalDesconto + Desconto[I];
TotalGeral := TotalGeral + Total[I];
StringGrid1.Cells[0,I + 1] := ´Total´;
StringGrid1.Cells[1,I + 1] := FloatToStr(TotalVista);
StringGrid1.Cells[2,I + 1] := FloatToStr(TotalCartao);
StringGrid1.Cells[3,I + 1] := FloatToStr(TotalCheque);
StringGrid1.Cells[4,I + 1] := FloatToStr(TotalDuplicata);
StringGrid1.Cells[5,I + 1] := FloatToStr(TotalPrazo);
StringGrid1.Cells[6,I + 1] := FloatToStr(TotalCortesia);
StringGrid1.Cells[7,I + 1] := FloatToStr(TotalDesconto);
StringGrid1.Cells[8,I + 1] := FloatToStr(TotalGeral);
End;
End;
End;
isto funciona
Gostei + 0
12/04/2005
Diogoalles
isso eu também utilizo atualmente.. que é ler os registros selecionados do Dbgrid que está com a opção multiselect ativa..
só eu é exatamente isso que quero mudar.. não utilizar mais dessa forma e sim colocar um chekbox que poderá ser selecionado..
para mim a alternativa como ja disse, é um campo calculado tipo boolean..
só que como vou fazer para calcular em cim do calculado?
abraço
Diogo
Gostei + 0
12/04/2005
Edilcimar
Gostei + 0
27/01/2017
Ismael Liborio
Utilizo uma função parecida a esta, tenho uma Dbgrid que desenha vários checkbox's na grid.
Mas deparei-me com um problema, em caso de engano no picar ou despicar no checkbox (ou duplo click na célula) aparece a palavra "true" ou "false" (dependendo da situação) selecionada e desaparece a chekbox.
Algué pode ajudar na resolução deste problema.
Obrigado
Gostei + 0
27/01/2017
Ismael Liborio
Utilizo uma função parecida a esta, tenho uma Dbgrid que desenha vários checkbox's na grid.
Mas deparei-me com um problema, em caso de engano no picar ou despicar no checkbox (ou duplo click na célula) aparece a palavra "true" ou "false" (dependendo da situação) selecionada e desaparece a chekbox.
Alguém pode ajudar na resolução deste problema.
Obrigado
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)