Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

sidneyps

i/o error 104

Recommended Posts

Pessoal, segundo o procedimento abaixo, está aparecendo o erro I/O error 104, alguém poderia me ajudar a localizar a origem do erro?:procedure TFormPrincipal.BtnexecutaClick(Sender: TObject);varbox:integer;xobs,s,linha:string;arq: TextFile;beginif BoxCemigwin.Checked thenbeginRZ.DatabaseName:='CEMIGWIN2';RZ.TableName:='RZ'+EditRz.Text+'99.dbf';RZ.Open;box:=2;end;RZ.first;OpenDialog1.InitialDir:='C:\';OpenDialog1.Filename:='fdia61.*'; if OpenDialog1.Execute then AssignFile ( arq, OpenDialog1.FileName ); Reset ( arq ); while not RZ.eof do begin If (copy(RZOBSERV.value,1,1) = 'R') then begin if MessageDlg('Foi achado uma observação para ser retirada, deseja prosseguir?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then Readln(arq,linha); while not Eof(arq) do begin Lblstatus.Caption:='Percorrendo os registros...'; If (copy(linha,2,5) = RZCONTA.Value ) then delete(linha,28,32); closefile(arq); end; end; RZ.next; Application.ProcessMessages; end;RZ.Close;ShowMessage('Procedimento concluído, arquivo salvo!');end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você não informou em que ponto o erro está ocorrendo nem em quais circunstâncias... mas achei os seguintes pontos problemáticos.

 

 if BoxCemigwin.Checked then begin    ...    RZ.Open;    ...  end;  RZ.first;
Se o checkbox BoxCemigwin não estiver marcado, RZ.Open não acontece e RZ.First provavelmente falhará (Talvez isso não seja um problema, pois depende do estado do dataset RZ antes do botão ser clicado).

 

 if OpenDialog1.Execute then    AssignFile(arq, OpenDialog1.FileName);  Reset(arq);
Se o usuário cancelar a caixa de diálogo, o AssignFile não é executado e o Reset provavelmente falhará.

 

     if MessageDlg('Foi ...', mtConfirmation, [mbYes, mbNo], 0) = mrYes then        Readln(arq, linha);      while not Eof(arq) do begin        ...
Me parece que o ReadLn está no lugar errado.

 

     while not Eof(arq) do begin        ...        closefile(arq);      end;
Seu erro deve estar ocorrendo nesse loop... o que acontece é que na primeira execução do loop o CloseFile fecha o arquivo e na segunda execução do loop dá o erro ao testar se chegou ao final do arquivo, pois o arquivo está fechado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente, já dei um jeito e passou a resolver, só que agora constatei um outro problema, o procedimento de deletar a parte da string linha, não está deletando nada, você pode me ajudar? while not Eof(arq) do begin Readln(arq,linha); Lblstatus.Caption:='Percorrendo os registros...'; If (copy(linha,2,5) = RZCONTA.Value ) then linha:=Delete(linha,28,32); // aqui está o erro, não deleta end;

Compartilhar este post


Link para o post
Compartilhar em outros sites
If (copy(linha,2,5) = RZCONTA.Value ) then
A não ser que você já saiba de antemão que linha ou RZCONTA.Value só contem letras maiúsculas/minúsculas ou estejam grafadas exatamente da mesma forma, esse teste tem chance de falhar em casos onde devia ter sucesso. O melhor é testar sem considerar letras maiúsculas/minúsculas, usando, por exemplo, AnsiCompareText ou AnsiSameText da unit SysUtils:
If AnsiCompareText(copy(linha,2,5), RZCONTA.Value) = 0 then
linha:=Delete(linha,28,32);
A princípio aqui só pode dar erro se você especificar um Index (parâmetro do meio) com valor fora de faixa, mas acho que não é o seu caso.Desculpe, pode ser que o comentário seguinte não se aplique a você, mas já conheci pessoas que esperavam que este exemplo de uso do Delete:
var  Source : string;begin  Source := '12345678';  Delete(Source, 3, 4);    // Delete the 3rd, 4th, 5th and 6th characters  ShowMessage('Source now : '+Source);end;
Resultasse em

Source now : 12    78 <- errado!

ao invés de

Source now : 1278 <- correto!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, eis aqui onde dá erro:{If AnsiCompareText(copy(linha,2,5), RZCONTA.Value) = 0 thenlinha:=Delete(linha,28,32);}veja a mensagem de erro:[Error] Ai001.pas(166): Incompatible types: 'String' and 'procedure, untyped pointer or untyped parameter'veja o código todo:procedure TFormPrincipal.Button1Click(Sender: TObject);vars,linha:string;arq: TextFile;beginif BoxCemigwin.Checked thenbeginRZ.DatabaseName:='CEMIGWIN2';RZ.TableName:='RZ'+EditRz.Text+'99.dbf';RZ.Open;end;RZ.first;OpenDialog1.InitialDir:='C:\';OpenDialog1.Filename:='fdia61.*';if OpenDialog1.Execute thenAssignFile ( arq, OpenDialog1.FileName );Reset ( arq );while not RZ.eof dobeginIf (copy(RZOBSERV.value,1,1) = 'R') thenbeginif MessageDlg('Foi achado uma observação para ser retirada, deseja prosseguir?',mtConfirmation, [mbYes, mbNo], 0) = mrYes thenwhile not Eof(arq) dobeginReadln(arq,linha);Lblstatus.Caption:='Percorrendo os registros...';If AnsiCompareText(copy(linha,2,5), RZCONTA.Value) = 0 thenlinha:=Delete(linha,28,32);end;end;RZ.next;Application.ProcessMessages;end;RZ.Close;closefile(arq);ShowMessage('Procedimento concluído, arquivo salvo!');end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe... http://forum.imasters.com.br/public/style_emoticons/default/blush.gif um erro passou desapercebido no meu segundo post...

{If  AnsiCompareText(copy(linha,2,5), RZCONTA.Value) = 0  thenlinha:=Delete(linha,28,32);}

Mude para...
If AnsiCompareText(copy(linha,2,5), RZCONTA.Value) = 0  then  Delete(linha,28,32);
O erro ocorre porque Delete é uma procedure, não uma function.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, este procedimento acha todos os dados no arquivo TXT que quero deletar, porem com está função: delete(linha,28,32) simplesmente não deleta nada. Será que ele deleta mas não está salvando o arquivo?Sidney

Compartilhar este post


Link para o post
Compartilhar em outros sites

... delete(linha,28,32) simplesmente não deleta nada. Será que ele deleta mas não está salvando o arquivo?

Delete vai excluir os caracteres pedidos da string "linha"... com relação ao arquivo... o conteúdo dele permanecerá inalterado, já que em momento algum está fazendo qualquer tipo de escrita no arquivo.Para ter o resultado que você espera, precisaria abrir um arquivo temporário para escrita, ir escrevendo nele as "linha"s lidas (tanto as que tem uma parte excluída como as outras) e no final do processamento, excluir o arquivo original e renomear o arquivo temporário para o nome do arquivo original.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.