Fórum ListBox #213071

10/02/2004

0

Como faço para varrer um ListBox item a item e verificar se esse item tem determinado valor, se tiver eu quero apagar este valor e ontinuar o laço até o ultimo item da lista... eu fiz o seguinte e nao deu certo, pq cada vez que eu deleto um item da lista o numero do laço continua o mesmo e devia mudar, ja que o numero de laços e o numero de items que tem na lista.
 iNumItemLista := lbAux.Count;
 for iCont := 1 to iNumItemLista do
    begin
      if Trim(Copy(lbAux.Items[iCont], 18,1)) <> ´*´ then
         begin
            lbAux.Items.Delete(iCOnt);
            Dec(iNumItemLista);
            continue;
         end;
    end;


Alguém tem uma outra solução?


Marcela

Marcela

Responder

Posts

10/02/2004

Ronaldo

Provavelmente seu erro está no FOR.

No lugar de ´for iCont := 1 to iNumItemLista do ´

tente ´for iCont := 0 to iNumItemLista - 1 do ´

As listas no delphi, normalmente, começam em zero~.


Responder

Gostei + 0

10/02/2004

Marcela

Provavelmente seu erro está no FOR. No lugar de ´for iCont := 1 to iNumItemLista do ´ tente ´for iCont := 0 to iNumItemLista - 1 do ´ As listas no delphi, normalmente, começam em zero~.



Responder

Gostei + 0

10/02/2004

Ronaldo

var iNumItemLista, icont: integer;
begin
icont := 0;
while iCont < lbAux.Count do
begin
if Trim(Copy(lbAux.Items[iCont], 18,1)) <> ´*´ then
begin
lbAux.Items.Delete(iCOnt);
continue;
end
else
inc(icont);
end;

Deculpe, eu não tinha prestado atençao na lógica que você utilizou.


Responder

Gostei + 0

10/02/2004

Beppe

O for não recalcula isso. mas você poderia ter invertido o sentido do loop que iria funcionar...

Pode ser um while tb:

I := lbAux.Count - 1;                    // começa do fim :o
while I >= 0 do
begin 
  if lbAux.Items[I][18] <> ´*´ then
    lbAux.Items.Delete(I); 
  Dec(I); 
end;


Mas um esquema melhor seria este, criando uma nova lista:
var
  T: TStringList;  
  I: Integer;
  S: String;
begin
  T := TStringList.Create;
  try
    for I := 0 to lbAux.Count - 1 do
    begin
      S := lbAux.Items[I];
      if S[18] = ´*´ then
        T.Add(S); 
    end;
  finally
    lbAux.Items.Clear;
    lbAux.Items.AddStrings(T);
    T.Free;
  end;
end;


Só ´testei´ de cabeça, mas acho que dará certo. Veja qua agora pode ser um for...to...do, já que a lista original não é mexida.

T+


Responder

Gostei + 0

11/02/2004

Fabio.hc

Outra forma poder ser assim:

Coloque no listbox a propriedade multselect = true;

for iCont := 0 to lbAux-1 do 
   lbAux.Selected[iCont]:=Trim(Copy(lbAux.Items[iCont], 18,1)) <> ´*´;
lbAux.DeleteSelected;



Responder

Gostei + 0

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

Aceitar