Ajuda com o componente TCheckComboBox - Lazarus

22/02/2019

8

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)?
Responder

Posts

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
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
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira