Utilizando Checklistbox no Delphi 10



Buenas, hoje pela manhã vi em um fórum que muitos programadores não utilizam o checklistbox por não saberem como usar ou não ver onde ele poderia ser aplicado.

Vamos num exemplo: 

Temos um cadastro de produto, e esse produto pode ter vários grupos ou variações, então teremos de selecionar vários grupos para cada produto.

Então vamos fazer um exemplo simples, nele vamos inicializar o checklistbox com informações que teremos uma uma tabela do banco, isso será num botão.

Na função de gravar vamos colocar o comando para gravar o'que alteramos para o banco de dados.

Exemplo prático: 

Vamos ter uma tabela chamada VARIACOES que ela terá CODIGO_VAIRACAO, DESCRICAO.

Vamos ter outra tabela chamada PRODUTOS_VARIACOES, nessa tabela vamos ter CODIGO_VARIACAO e CODIGO_PRODUTO. 

Botão btnAbrirVariacoesClick vamos colocar um comando para limpar o checklistboxapós isso um SQL para trazer todas as variações e fazer vínculo com a tabela PRODUTOS_VARIACOES para ver quais já foram marcados, após isso vamos colocar um  laço de repetição para poder preencher o checklistbox.

procedure TFSistemas.btnAbrirVariacoesClick(Sender: TObject);
begin
  CheckListBox.Clear;
  FDQuery1.Close;
  FDQuery1.SQL.Text := 'select ('' '' || H.CODIGO_VARIACAO || '' - '' || H.DESCRICAO) as DESCRICAO,' +
    ' iif(AV.CODIGO_PRODUTO > 0, 1, 0) as MARCADO, H.CODIGO_VARIACAO' +
    ' from VARIACOES H' +
    ' left join PRODUTOS_VARIACOES AV on AV.CODIGO_VARIACAO = H.CODIGO_VARIACAO' +
    ' and AV.CODIGO_PRODUTO =  ' + IntToStr(tbProdutosCODIGO_PRODUTO.asInteger) +
    ' order by H.DESCRICAO';
  FDQuery1.Open;
  FDQuery1.First;
  while not FDQuery1.Eof do begin
    CheckListBox.Items.Append(FDQuery1.FieldByName('DESCRICAO').AsString);
    CheckListBox.Checked[FDQuery1.RecNo - 1] := FDQuery1.FieldByName('MARCADO').AsInteger = 1;
    FDQuery1.Next;
  end;
end;
Nossa tela esta ficando assim.


Vamos para o botão btnSalvarVariacoes agora:

procedure TFSistemas.btnSalvarVariacoesClick(Sender: TObject);
var
  lString,
  lCodigo: String;
  li: Integer;
begin
  lString := EmptyStr;
  {Verifica as variações que estão marcadas e salvar em uma variável separando por virgula}
  for li := 0 to CheckListBox.Count - 1 do begin
    if CheckListBox.Checked[li] then begin
      lCodigo := copy(CheckListBox.Items[li], 0, 50);
      lString := lString + (ifthen(lString <> '', ', ') + Trim(Copy (lCodigo, 1, Pos ('-', lCodigo) - 1)));
    end;
  end;
  {Aqui vamos deletar o conteúdo da tabela para depois fazer um insert}
  FDConnection1.ExecSQL('delete from PRODUTOS_VARIACOES' +
    ' where CODIGO_PRODUTO = ' + IntToStr(tbProdutosCODIGO_PRODUTO.asInteger));
  {Nessa parte verificamos se algum campo foi marcado se houver algum campo iremos fazer um insert na tabela}
  if Trim(lString) <> EmptyStr then begin
    FDConnection1.ExecSQL('insert into PRODUTOS_VARIACOES (CODIGO_PRODUTO, CODIGO_VARIACAO)' +
      ' select ' + IntToStr(tbProdutosCODIGO_PRODUTO.asInteger) + ', V.CODIGO_VARIACAO' +
      ' from VARIACOES V' +
      ' where V.CODIGO_VARIACAO in (' + lString + ')');
  end;
end;
Um exemplo simples da utilização, tem muitas coisas que dá para melhorar para deixar mais dinâmico para o usuário, mas vamos ver como ficou?




0 comentários:

Postar um comentário