ListBox
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.
Alguém tem uma outra solução?
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
Curtidas 0
Respostas
Ronaldo
10/02/2004
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~.
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~.
GOSTEI 0
Marcela
10/02/2004
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~.
GOSTEI 0
Ronaldo
10/02/2004
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.
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.
GOSTEI 0
Beppe
10/02/2004
O for não recalcula isso. mas você poderia ter invertido o sentido do loop que iria funcionar...
Pode ser um while tb:
Mas um esquema melhor seria este, criando uma nova lista:
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+
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+
GOSTEI 0
Fabio.hc
10/02/2004
Outra forma poder ser assim:
Coloque no listbox a propriedade multselect = true;
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;
GOSTEI 0