Ir para conteúdo
Fórum Script Brasil
  • 0

não repetir no listbox


frnd

Pergunta

Criei um listbox que irá receber alguns números e queria que eles não se repetissem,

como eu faria?

existe essa função:

function Tem(SL: TStringList; Linha: String): Boolean;
var
  a: Integer;
  b: Boolean;
begin
  b := False;
  for a := 0 to SL.Count - 1 do
  begin
    if (SL[a] = Linha) then
    begin
      b := True;
    end;
  end;
  result := b;
end;

[]s

como eu a utilizo no listbox?

Editado por frnd
Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

opa

function Tem(LB: TListBox; Linha: String): Boolean;
var
  i: Integer;
begin
  for i := 0 to LB.Items.Count - 1 do
  begin
    Result := (LB.Items[i] = Linha);
    if Result then
    Break;
  end;
end;

ou também

function Tem(LB: TListBox; Linha: String): Boolean;
var
  i: Integer;
begin
  Result := False;
  i := 0;
  while (i < LB.Items.Count - 1) and (not Result) do
  begin
    Result := (LB.Items[i] = Linha);
    Inc(i);
  end;
end;

tem outras formas também, mas já ajuda rs

abraco

Link para o comentário
Compartilhar em outros sites

  • 0

Opa

não... voce precisa chama-la antes de adicionar o numero ao listbox

Exemplo

If not Tem(ListBox1, NUMERO) then

ListBox1.Items.Add(NUMERO);

Troque o NUMERO pelo numero a ser adicionado e no caso entre aspas simples porque é uma string....

abraco

Link para o comentário
Compartilhar em outros sites

  • 0

coloquei desta maneira dentro de do onclick de um botão que irá add no listbox, mas ainda o mesmo numero aparece 2 vezes, porque será?

procedure TForm3.BuscarClick(Sender: TObject);
var
  LB: TStringList;
begin
  if Edit1.Text = '' then
  begin
    ShowMessage('Digite o número da pedra!');
    EDit1.SetFocus;
    exit;
  end;

  Form1.Table1.First;

  If Form1.Table1.Locate('CODBINGO',string(Edit1.Text), []) then  // varrer a tabela para achar o numero da pedra
  begin
    Form5.Show; // se encontrou  exibe o Form com o nome da empresa
    begin
      LB:= TStringList.Create;
      If not Tem(Form6.ListBox1, Form3.Edit1.Text) then
        LB.Add(Form3.Edit1.Text);

      Form6.ListBox1.Items.Add(Edit1.Text);
    end;
  end
  else
  begin
    ShowMessage('Esta pedra não está cadastrada!');  // se não encontrou
    Edit1.SetFocus;
  end;
end;

Editado por Micheus
Ajustada a identação do código. O editor do forum bagunçou a identação introduzindo tabulações.
Link para o comentário
Compartilhar em outros sites

  • 0

você tb pode fazer assim:

if ListBox1.Items.IndexOf(minhaVariavel) = -1 Then

ListBox1.Items.Add(minhaVariavel);

porque se já existir o item q você esta tentando inserir sera retornado o indice dele dendro do listbox, caso contrario retornará

"-1" ai você insere

Editado por Erso
Link para o comentário
Compartilhar em outros sites

  • 0
coloquei desta maneira dentro de do onclick de um botão que irá add no listbox, mas ainda o mesmo numero aparece 2 vezes, porque será?
frnd, você está "pensando" na execução de duas instruções, mas não usou o delimitador de bloco (begin..end) para isto.

Quando você faz um teste com a instrução if, se houve mais que uma instrução a ser executada você TEM que usar o delimitador de bloco, do contrário, apenas a primeira instrução após o if, o respeitará (será executada conforme condição)

Segue a correção:

begin
  LB:= TStringList.Create;
    If not Tem(Form6.ListBox1, Form3.Edit1.Text) then
    begin
      LB.Add(Form3.Edit1.Text);

      Form6.ListBox1.Items.Add(Edit1.Text);
    end;
  end;
mas para ser sincero, acho que você deu uma viajada... Para que é que você está usando este LB? Ele é criado dentro do procedimento, a verificação não é feita sobre ele, ele recebe a inserção do texto e va não faz mais nada com ele. Fora que faltou liberá-lo da memória - LB.Free.
begin
  // LB:= TStringList.Create;   <==== REMOVER
    If not Tem(Form6.ListBox1, Form3.Edit1.Text) then
  //    LB.Add(Form3.Edit1.Text);   <==== REMOVER

      Form6.ListBox1.Items.Add(Edit1.Text); <== FICA APENAS ESTA
  end;

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
o LB.Free colocaria no final?

frnd, este final deve ser em algum lugar deste procedimento onde o endereço alocado para de LB seja válido e após você fazer o que deseja com ele.

Eu editei a identação do seu código no post #1, para ficar mais claro onde estão os blocos de instrução. Assim, baseado no que você postou, o Free deveria ser chamado no ponto listado abaixo:

...
  If Form1.Table1.Locate('CODBINGO',string(Edit1.Text), []) then
  begin
    Form5.Show; // se encontrou  exibe o Form com o nome da empresa
    begin
      LB:= TStringList.Create;
      If not Tem(Form6.ListBox1, Form3.Edit1.Text) then
      begin
        LB.Add(Form3.Edit1.Text);

        Form6.ListBox1.Items.Add(Edit1.Text);
      end;
      LB.Free;  <=== ao final deste bloco, onde ele foi inicializado
    end;
  end
  else
...

mas, lembrando, que até agora você não fez nada com o conteúdo dele. ;)

Ah.... fiz o seguinte para utilizar o Free.

Criei um botão que limpa todos os números na lista e em seguinda dou o free.

Impossível funcionar, se a variável é LOCAL ao procedimento do seu outro botão - Buscar.

Se você vai precisar desta lista para usar durante toda a existência desta tela, então, você tem que definir e criar ela de modo GLOBAL ao form.

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...