Ajuda com o componente TCheckComboBox - Lazarus
Bom dia!!
Sou iniciante (estou a 1 mês estagiando) em Delphi/Lazarus e estou com o seguinte problema:
Preciso criar um filtro em uma tela, onde é possível a pessoa selecionar um ou mais itens (Pessoas) de um combobox, depois essas pessoas selecionadas, ao apertar OK vão para o dbgrid e mostramos os detalhes. Porém eu preciso colocar no combobox o id (para buscar no banco os detalhes), e o nome da empresa (pra mostrar pro usuario).
1º: Como eu guardo esses dados no componente TCheckComboBox? Estou tentando fazer da seguinte forma mas está me retornando SIGSEGV error:
2: Como eu passos o(s) id(s) selecionados como parâmetro na minha Query (qPessoas)?
Sou iniciante (estou a 1 mês estagiando) em Delphi/Lazarus e estou com o seguinte problema:
Preciso criar um filtro em uma tela, onde é possível a pessoa selecionar um ou mais itens (Pessoas) de um combobox, depois essas pessoas selecionadas, ao apertar OK vão para o dbgrid e mostramos os detalhes. Porém eu preciso colocar no combobox o id (para buscar no banco os detalhes), e o nome da empresa (pra mostrar pro usuario).
1º: Como eu guardo esses dados no componente TCheckComboBox? Estou tentando fazer da seguinte forma mas está me retornando SIGSEGV error:
begin qPessoa.First; while (not qPessoa.Eof) do begin ccbPessoas.Items.AddObject(qPessoa.FieldByName(''NOME'').AsString, TObject (qPessoa.FieldByName(''PESSOA_ID'').AsInteger )); qPessoa.Next; end; end;
2: Como eu passos o(s) id(s) selecionados como parâmetro na minha Query (qPessoas)?
Danilo
Curtidas 0
Respostas
Hélio Devmedia
22/02/2019
Olá Danilo, tudo bem?
Existe várias formas de fazer isto, inclusive na escolha do componente. eu por exemplo prefiro o TCheckListBox, que é bem mais versátil para isto...
Seguindo sua lista de raciocínio, vamos lá...
1º - Quando adicionar AddObject não tente transformar um valor Inteiro em objeto como está fazendo em TObject
(qPessoa.FieldByName(''PESSOA_ID'').AsInteger ) mas ao invés disso passe o field mesmo assim
o retorno do método FieldByName é um objeto do tipo TIntegerField que pertence ao dataset.
2 - Quando você for montar a query, você vai ter que:
a) Pegar os objetos selecionados;
b)criar uma string deles;
c) passar na clausula where .. in ( <ids aqui>);
Observe (usando TCheckListBox porque não achei o componente cheklistCombobox:
Existe várias formas de fazer isto, inclusive na escolha do componente. eu por exemplo prefiro o TCheckListBox, que é bem mais versátil para isto...
Seguindo sua lista de raciocínio, vamos lá...
1º - Quando adicionar AddObject não tente transformar um valor Inteiro em objeto como está fazendo em TObject
(qPessoa.FieldByName(''PESSOA_ID'').AsInteger ) mas ao invés disso passe o field mesmo assim
ccbPessoas.Items.AddObject(qPessoa.FieldByName(''NOME'').AsString, qPessoa.FieldByName(''PESSOA_ID''));
o retorno do método FieldByName é um objeto do tipo TIntegerField que pertence ao dataset.
2 - Quando você for montar a query, você vai ter que:
a) Pegar os objetos selecionados;
b)criar uma string deles;
c) passar na clausula where .. in ( <ids aqui>);
Observe (usando TCheckListBox porque não achei o componente cheklistCombobox:
var I: Integer; id: TIntegerField; s: TStringList; ids: string; begin s:=TStringList.Create; //objeto para montar uma string; s.Delimiter:=','; s.StrictDelimiter:=true; for I := 0 to CheckListBox1.Count do //passa item por item begin if CheckListBox1.Checked[I] then // se item estiver marcado begin id:=TIntegerField(CheckListBox1.Components[I]); s.Add(id.AsString) //está pegando o valor do field do dataset e passando pra StringList com string mesmo; end; end; //Não sei qual o componente de fazer a query mas vai ser parecido: ids:=s.DelimitedText; //ids recebe um texto assim: 1,2,3,4,5,6,7,8,9,10,... query.sql:='Select * from clientes where cliente_id in ('+ids+')'; end;
GOSTEI 0
Danilo
22/02/2019
Olá Danilo, tudo bem?
Existe várias formas de fazer isto, inclusive na escolha do componente. eu por exemplo prefiro o TCheckListBox, que é bem mais versátil para isto...
Seguindo sua lista de raciocínio, vamos lá...
1º - Quando adicionar AddObject não tente transformar um valor Inteiro em objeto como está fazendo em TObject
(qPessoa.FieldByName(''PESSOA_ID'').AsInteger ) mas ao invés disso passe o field mesmo assim
o retorno do método FieldByName é um objeto do tipo TIntegerField que pertence ao dataset.
2 - Quando você for montar a query, você vai ter que:
a) Pegar os objetos selecionados;
b)criar uma string deles;
c) passar na clausula where .. in ( <ids aqui>);
Observe (usando TCheckListBox porque não achei o componente cheklistCombobox:
Existe várias formas de fazer isto, inclusive na escolha do componente. eu por exemplo prefiro o TCheckListBox, que é bem mais versátil para isto...
Seguindo sua lista de raciocínio, vamos lá...
1º - Quando adicionar AddObject não tente transformar um valor Inteiro em objeto como está fazendo em TObject
(qPessoa.FieldByName(''PESSOA_ID'').AsInteger ) mas ao invés disso passe o field mesmo assim
ccbPessoas.Items.AddObject(qPessoa.FieldByName(''NOME'').AsString, qPessoa.FieldByName(''PESSOA_ID''));
o retorno do método FieldByName é um objeto do tipo TIntegerField que pertence ao dataset.
2 - Quando você for montar a query, você vai ter que:
a) Pegar os objetos selecionados;
b)criar uma string deles;
c) passar na clausula where .. in ( <ids aqui>);
Observe (usando TCheckListBox porque não achei o componente cheklistCombobox:
var I: Integer; id: TIntegerField; s: TStringList; ids: string; begin s:=TStringList.Create; //objeto para montar uma string; s.Delimiter:=','; s.StrictDelimiter:=true; for I := 0 to CheckListBox1.Count do //passa item por item begin if CheckListBox1.Checked[I] then // se item estiver marcado begin id:=TIntegerField(CheckListBox1.Components[I]); s.Add(id.AsString) //está pegando o valor do field do dataset e passando pra StringList com string mesmo; end; end; //Não sei qual o componente de fazer a query mas vai ser parecido: ids:=s.DelimitedText; //ids recebe um texto assim: 1,2,3,4,5,6,7,8,9,10,... query.sql:='Select * from clientes where cliente_id in ('+ids+')'; end;
Bom dia! Infelizmente não funcionou... ainda estou tendo problema de SIGSEGV error, e agora aparece uma mensagem:
" checkcombobox: item 0 is not a TCheckComboItem State"
GOSTEI 0
Hélio Devmedia
22/02/2019
Este componente TCheckComboItem eu não encontro ele nem no lazarus e nem no delphi. Passe mais detalhes sobre seu ambiente de programação... versão do delphi e tal...
GOSTEI 0