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

Remover linha de texto


ademilson

Pergunta

Eu sou iniciante em delphi e estou tendo um problema: em uma lista de arquivo do tipo texto, quero remover um item, como um nome por exemplo. Consigo remover qualquer item da lista, porém, se eu remover qualquer 1 sem ser o último, aparece o seguinte erro:

List Index out of bounds(numero variável de acordo com a quantidade de itens de minha lista), mas, remove o nome mesmo apresentando esse erro, e quando removo o último da lista, o nome é removido normalmente.

meu codigo é esse:

begin

Nome := ComboProfessor.Text;

Lista := TStringList.Create;

Lista.LoadFromFile('c:\Gfe\Arquivos\Notas\Professor.txt');

For i := 1 to Lista.Count -1 do

begin

If Lista = Nome then

begin

Lista.Delete(i);

ShowMessage('O Professor ' + Nome + ' foi removido do Sistema!');

Lista.SaveToFile('c:\Gfe\Arquivos\Notas\Professor.txt');

ListProfessor.DeleteSelected;

end;

end;

End;

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0
em uma lista de arquivo do tipo texto, quero remover um item, como um nome por exemplo. Consigo remover qualquer item da lista, porém, se eu remover qualquer 1 sem ser o último, aparece o seguinte erro:

List Index out of bounds(numero variável de acordo com a quantidade de itens de minha lista), mas, remove o nome mesmo apresentando esse erro, e quando removo o último da lista, o nome é removido normalmente.

meu codigo é esse:

begin
    Nome := ComboProfessor.Text;
      Lista := TStringList.Create;
        Lista.LoadFromFile('c:\Gfe\Arquivos\Notas\Professor.txt');
          For i := 1 to Lista.Count -1 do
            begin
              If Lista[i] = Nome then
                begin
                    Lista.Delete(i);
                      ShowMessage('O Professor ' + Nome + ' foi removido do Sistema!');
                            Lista.SaveToFile('c:\Gfe\Arquivos\Notas\Professor.txt');
                              ListProfessor.DeleteSelected;
                end;
            end;
End;
Seu problema reside no fato de que você está usando um FOR. Note que você indexa este FOR até o item Count-1. Assim, se Count inicialmente valia 6, então seu for irá fazer interações até que atinga o valor 5 (6-1). Caso você delete um dos itens dentro do FOR, agora você terá apenas 5 itens na lista, ou seja, poderá indexá-los de 0..4 - Resultado: na última interação do FOR, cujo valor será 5, o maior indexador esperado seria 4 (erro: list index out of bound). Para esta situação, você deve usar um WHILE. Assim, você incrementa o indexador (variável "i") apenas quando não deletar um item. Algo assim:
...
i := 0;
while i < (Lista.Count -1) do
begin
  If Lista[i] = Nome then
  begin
    Lista.Delete(i);
    ShowMessage('O Professor ' + Nome + ' foi removido do Sistema!');
    Lista.SaveToFile('c:\Gfe\Arquivos\Notas\Professor.txt');
    ListProfessor.DeleteSelected;
  end else
    Inc(i);
end;
...

OBS: Se condirarmos que o seu arquivo não tenha um cabeçalho, então você ainda ter que observar que o indexador deve começar do primeiro elemento que é 0 e não 1, conforme você usou no FOR.

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,4k
×
×
  • Criar Novo...