Fórum Utilizar um CheckBox para realizar Multiselect no DBGrid #276759

12/04/2005

0

Olá pessoal
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

Diogoalles

Responder

Posts

12/04/2005

Cabelo

Colega..

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


Responder

Gostei + 0

12/04/2005

Macario

Voce quer trabalhar com a multiseleção do Grid, ou quer trabalhar com o campo Boolean?

Porque no caso voce esta com as duas opções!

No que se aplicaria a multiseleção?


Responder

Gostei + 0

12/04/2005

Diogoalles

Bem
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


Responder

Gostei + 0

12/04/2005

Macario

Caro diogoalles,

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;



Responder

Gostei + 0

12/04/2005

Diogoalles

Após selecionar os registro eu tenho uma função que verificar todos os registros selecionados.. através dos itens selecionados tem varias utilizações para eles, como por exemplo selecionar os registros que devem sair num relatorio.etc...

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


Responder

Gostei + 0

12/04/2005

Macario

Ja que falou em banco? qual esta usando? Voce usa ClientDataSet?

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.


Responder

Gostei + 0

12/04/2005

Diogoalles

Utilizo Firebird e componentes Table e Query :?

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


Responder

Gostei + 0

12/04/2005

Edilcimar

isto é parte de um programa que utilizo para calcular as comissões dos vendedores selecionados dentro de um determinado período, os quais são selecionados através do dbgrid

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


Responder

Gostei + 0

12/04/2005

Diogoalles

Blz edilcimar,
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


Responder

Gostei + 0

12/04/2005

Edilcimar

se existe um campo boolean, o qual seria acionado quando selecionado(passando de F para T), então depois é só somar os campos que estão T, e o campo calculado seria executado independentemente de estar T ou F, isto se entendi direito


Responder

Gostei + 0

27/01/2017

Ismael Liborio

Boa tarde Pessoal,
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
Responder

Gostei + 0

27/01/2017

Ismael Liborio

Boa tarde Pessoal,
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
Faltou dizer que a check box que desaparece volta aparecer quando clico noutra checkbox diferente. Obrigado
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar