Fórum TStringList -> List Index Out Of Bounds(0) ERRO.. #485762
17/07/2014
0
Olá, segue abaixo o código.:
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!
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
Curtir tópico
+ 0
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).
Abs.
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
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.:
percebo que, uma stringlist não pode receber um conteúdo em uma string que não existe,.. por isso, ao tentar como.:
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.:
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
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
Clique aqui para fazer login e interagir na Comunidade :)