sidneyps 0 Denunciar post Postado Março 21, 2005 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
Massuda 0 Denunciar post Postado Março 22, 2005 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
sidneyps 0 Denunciar post Postado Março 22, 2005 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
Massuda 0 Denunciar post Postado Março 22, 2005 If (copy(linha,2,5) = RZCONTA.Value ) thenA 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 emSource now : 12 78 <- errado!ao invés deSource now : 1278 <- correto! Compartilhar este post Link para o post Compartilhar em outros sites
sidneyps 0 Denunciar post Postado Março 22, 2005 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
Massuda 0 Denunciar post Postado Março 23, 2005 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
sidneyps 0 Denunciar post Postado Março 23, 2005 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
Massuda 0 Denunciar post Postado Março 23, 2005 ... 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
sidneyps 0 Denunciar post Postado Março 23, 2005 Agora você me confundiu a cuca! você pode me dar um exemplo?ObrigadoSidney Compartilhar este post Link para o post Compartilhar em outros sites