Ajuda com o componente TCheckComboBox - Lazarus

22/02/2019

22

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:
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

Danilo

Responder

Posts

22/02/2019

Hélio Devmedia

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

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;



Responder

25/02/2019

Danilo

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

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"
Responder

25/02/2019

Hélio Devmedia

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...
Responder

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

Aceitar