GARANTIR DESCONTO

Fórum TStringList -> List Index Out Of Bounds(0) ERRO.. #485762

17/07/2014

0

Olá, segue abaixo o código.:
procedure TForm1.Button1Click(Sender: TObject);
var i,linha1,linha2,x:integer;
begin
stringlist:=TStringList.Create;
for i:=0 to memo1.lines.Count-1 do
stringlist.Strings[i]:=memo1.lines[i] +';';
showmessage(stringlist.Text);
memo2.lines.Add(stringlist.Text);
///            /////               /////             /////

for linha1:=0 to stringlist.Count-2 do
begin
x:=linha1+1;
begin
for linha2:=x to stringlist.count-1 do
begin
if stringlist.Strings[linha1]=stringlist.Strings[linha2] then
begin
stringlist.Delete(linha2);
while stringlist.Strings[linha1]=stringlist.Strings[linha2] do
stringlist.delete(linha2);
end
end;
end;
end;

memo2.lines.Add(StringList.Text);


end;

end.


Basicamente, o programa coloca ponto e vírgula e verifica se há duplicidade nas linhas.
Utilizando o TStringList ele dá o seguinte erro.: List Index Out Of Bounds(0)
Mas utilizando um Memo para manipular, ao invés do TStringList, meu código roda, efetiva sem erros.

A ideia é utilizar o TStringList, pois sei que ele é muito mais rápido para escalas de linhas grandes(50k, 500k de linhas).

Qual será o bendito erro? Lendo por fora, da para se entender que o INDEX que o programa procurou não existe, mas, isso não ocorre usando um MEMO, e é a mesma coisa, ao invés do memo1.lines[x] uso stringlist.strings[x], e assim sucessivamente, porquê um o erro acontece, e outro não?..
Grato!
Alexandre

Alexandre

Responder

Post mais votado

17/07/2014

Olá Alexandre, bom dia.

Pelo que notei quando você dá um delete na linha do TstringList a contagem do for de nível mais baixo ela diminui e quando você começa o while dentro desse for as variáveis continuam a fazer referencia a um index que possivelmente não existe mais, por isso o erro.
Veja se o código abaixo te atende. (Modifiquei algumas linhas do seu original).

procedure TForm1.Button1Click(Sender: TObject);
var
   i,linha1,linha2,x:integer;
   stringlist:TStringList;
begin
    stringlist:=TStringList.Create;
    try
        for i:=0 to memo1.lines.Count-1 do
            stringlist.Add(memo1.lines[i] +';');

        showmessage(stringlist.Text);
        memo2.lines.Add(stringlist.Text);
        ///            /////               /////             /////

        for linha1:=0 to stringlist.Count-1 do
        begin
            x:=linha1+1;
            for linha2 := stringlist.Count-1 downto x do
            begin
                if SameText(stringlist[linha1],stringlist[linha2]) then
                   stringlist.Delete(linha2);
            end;
        end;

        Memo2.Lines:= stringlist;
    finally
       FreeAndNil(stringlist);
    end;
end;



Abs.

Valquiria Silva

Valquiria Silva
Responder

Gostei + 1

Mais Posts

18/07/2014

Alexandre

Valquiria, foi de grande sua ajuda para eu reconhecer os erros..
Primeiro erro.:
Eu estava aplicando esta linha incorretamente, mesmo não gerando erros antes de executar, durante a execução ela apresentaria evidentemente erro, veja.:
stringlist.Strings[i]:=memo1.lines[i] +';';

percebo que, uma stringlist não pode receber um conteúdo em uma string que não existe,.. por isso, ao tentar como.:
memo2.lines[i] := memo1.lines[i]+';'; 

o código funciona, pois o memo ele recebe uma linha a uma já existente(ou seja, uma linha sempre existe, já para o TStringList, ele precisa de uma STRING(algum texto/palavra) para poder receber algum texto/palavra no index apontado.)


Segundo erro.:
Segundo erro, encontrei na linha.:
for linha2:=x to stringlist.count-1 do

reconheci que, o for..do, pega os valores e simplesmente executa-os sem verificar as variações dos termos, ou seja,.. quando o stringlist.count mudava(devido o delete de uma linha) no comando for
ao invés de ficar stringlist.count-1 como: 10 por exemplo, continuava em 11, dai a linha2 iria até o 11, e o 11 já deixava de existir.
Reconheci o erro acima após usar um WHILE ao inves de FOR, porque o WHILE verifica os termos, e atualiza eles, já o for não.
Por isso seu for..do funcionou, pois ele pegava de um termo que variava(stringlist.count) até um termo fixo(x), ao invés do meu que ia de um termo fixo(x) até um termo que variava(stringlist.count). Logo se, o termo que variava(stringlist), que era até onde meu primeiro termo ia(x), varia-se(no meu caso, se uma linha fosse deletada) o x iria até um INDEX que já deixou de existir na minha TStringList, devido ao delete feito durante o processo.

Se eu tiver errado, por favor, me corrijam, ou se tiver algo para acrescentar, a vontade, estou aberto a novidades, dicas, e mais informações.

Grato,
Alexandre
Responder

Gostei + 0

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

Aceitar