Segue a pequena alteração no AcbrTefDClass que eu fiz:
procedure TACBrTEFDClass.ImprimirRelatorio;
Var
I : Integer;
TempoInicio : TDateTime ;
ImpressaoOk, RemoverMsg, GerencialAberto : Boolean ;
Est : AnsiChar ;
ArqBackup : String ;
ImagemComprovante : TStringList ;
begin
VerificarIniciouRequisicao;
if Resp.QtdLinhasComprovante < 1 then
exit ;
GravaLog( Name +' ImprimirRelatorio: '+Req.Header );
CopiarResposta ;
ImpressaoOk := False ;
RemoverMsg := False ;
GerencialAberto := False ;
TempoInicio := now ;
with TACBrTEFD( Owner ) do
begin
try
BloquearMouseTeclado( True );
while not ImpressaoOk do
begin
try
try
Est := EstadoECF;
if Est <> 'L' then
begin
{ Fecha Vinculado ou Gerencial ou Cupom, se ficou algum aberto por Desligamento }
case Est of
'C' : ComandarECF( opeFechaVinculado );
'G', 'R' :
begin
ComandarECF( opeFechaGerencial );
// Alterado por Rafael Sartori
// para que em caso de falta de papel ou queda de luz na ecf ele
// feche o cupom e abra novamente depois para imprimir tudo novamente
GerencialAberto := False;
//
end;
'V', 'P' : ComandarECF( opeCancelaCupom );
end;
if EstadoECF <> 'L' then
raise EACBrTEFDECF.Create( ACBrStr('ECF não está LIVRE') ) ;
end;
TempoInicio := now ;
if Self.Resp.TextoEspecialOperador <> '' then
begin
RemoverMsg := True ;
DoExibeMsg( opmExibirMsgOperador, Self.Resp.TextoEspecialOperador ) ;
end;
if Self.Resp.TextoEspecialCliente <> '' then
begin
RemoverMsg := True ;
DoExibeMsg( opmExibirMsgCliente, Self.Resp.TextoEspecialCliente ) ;
end;
I := 1 ;
while I <= self.NumVias do
begin
if I = 1 then
ImagemComprovante := Self.Resp.ImagemComprovante1aVia
else
ImagemComprovante := Self.Resp.ImagemComprovante2aVia ;
if ImagemComprovante.Count > 0 then
begin
if not GerencialAberto then
begin
ComandarECF( opeAbreGerencial ) ;
GerencialAberto := True;
end
else
begin
if I <> 1 then
ComandarECF( opePulaLinhas ) ;
DoExibeMsg( opmDestaqueVia, 'Destaque a '+IntToStr(I)+'ª Via') ;
end ;
ECFImprimeVia( trGerencial, I, ImagemComprovante )
end ;
Inc( I ) ;
end;
if GerencialAberto then
ComandarECF( opeFechaGerencial );
ImpressaoOk := True ;
finally
{ Removendo a mensagem do Operador }
if RemoverMsg then
begin
{ Verifica se Mensagem Ficou pelo menos por 5 segundos }
if ImpressaoOk then
begin
while SecondsBetween(now,TempoInicio) < 5 do
begin
Sleep(EsperaSleep) ;
Application.ProcessMessages;
end;
end;
DoExibeMsg( opmRemoverMsgOperador, '' ) ;
DoExibeMsg( opmRemoverMsgCliente, '' ) ;
end;
end;
except
on EACBrTEFDECF do ImpressaoOk := False ;
else
raise ;
end;
if not ImpressaoOk then
begin
if DoExibeMsg( opmYesNo, 'Impressora não responde'+sLineBreak+
'Tentar novamente ?') <> mrYes then
break ;
end;
end;
finally
{ Enviando CNF ou NCN e apagando Arquivo de Backup }
ArqBackup := Resp.ArqBackup ;
while FileExists( ArqBackup ) do
begin
try
if ImpressaoOk then
self.CNF
else
self.NCN ;
DeleteFile( ArqBackup ) ;
except
end;
end ;
BloquearMouseTeclado( False );
end ;
if not ImpressaoOk then
begin
// Alterado por Rafael Sartori
// Tento ao menos fechar o relatorio se a ECF estiver ligada..
Est := EstadoECF;
case Est of
'G', 'R' : ComandarECF( opeFechaGerencial )
end;
//
raise EACBrTEFDECF.Create( ACBrStr('Impressão de Relatório Falhou' ) ) ;
end;
end;
end;