Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 2323 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado (editado)

Boa noite pessoal, fiquei na dúvida em qual área do fórum postar essa dúvida!

Estou finalizando meu sistema para emissão de NFC-e com ACBrSAT e ACBrPosPrinter e está correndo tudo muito bem, mas sempre temos que testar vários caminhos onde temos que simular erros. 

Então estou tentando verificar o status da minha impressora Epson TM T20 (USB), caso ocorram situações em que a impressora não esteja ligada, quando usava a "InterfaceEpsonNF.dll" existia um método onde controlava com uma exception esse status e avisava o usuário do problema, mas com o componente ACBrPosPrinter não consigo nem gerar uma exception.

Desligo a impressora e mando imprimir, mas não gera nenhum tipo de erro, existe a possibilidade de capturar esse status com o ACBrPosPrinter?

Editado por William F. L.
image.png.7b12b65221605b4e2ee1b0693683f18d.png

Sistemas para Bares, Restaurantes e Varejo

https://www.wllsistemas.com.br

 

Postado (editado)

Daniel passando para compartilhar minha solução!

Segui meus testes com a Unit WinSpool.pas e consegui verificar o status da minha impressora EPSON TM T20 (USB), compartilhada na rede.

As 2 funções foram escritas baseadas em postagem colhidas na WEB, não saberia dizer em quais sites exatamente porque foram várias pesquisas.

A função VerStatusImpressora() captura um valor cardinal e a função RetornaStatusString() verifica esse valor comparando com as constantes e retorna uma string, durante meus testes a impressora ligada sempre retornava o valor "0" e quando desligada retornava "4096".

Obtive sucesso nos 2 ambientes de Teste:

Windows Seven 32 bits (Máquina Virtual em Desktop com Linux) acessando a impressora via rede

Windows 10 64 bits (Notebook) com a impressora instalada

Observação: A verificação do status não funcionou com IP, somente com o nome da máquina onde estava instalada a impressora, exemplo \\DESKTOP-FO4AT77\Epson

function TForm2.VerStatusImpressora(CaminhoImpressora: string): string;
var
  hPrinter : THandle;
  pInfo: PPrinterInfo2;
  bytesNeeded: DWORD;
begin
  OpenPrinter(PChar(CaminhoImpressora), hPrinter, nil);

  try
      Winspool.GetPrinter( hPrinter, 2, Nil, 0, @bytesNeeded );
      pInfo := AllocMem( bytesNeeded );
      try
        Winspool.GetPrinter( hPrinter, 2, pInfo, bytesNeeded, @bytesNeeded );
        Result := RetornaStatusString(pInfo^.Status);
      finally
        FreeMem( pInfo );
      end;
  finally
     ClosePrinter( hPrinter );
  end;
end;

function TForm2.RetornaStatusString(Status:cardinal):string;
begin
    result := '';
    if Status and PRINTER_STATUS_BUSY = PRINTER_STATUS_BUSY then result := result + '; The printer is busy. ';
    if Status and PRINTER_STATUS_DOOR_OPEN = PRINTER_STATUS_DOOR_OPEN then result := result + '; The printer door is open. ';
    if Status and PRINTER_STATUS_ERROR = PRINTER_STATUS_ERROR then result := result + '; The printer is in an error state. ';
    if Status and PRINTER_STATUS_INITIALIZING =PRINTER_STATUS_INITIALIZING then result := result + '; The printer is initializing. ';
    if Status and PRINTER_STATUS_IO_ACTIVE =PRINTER_STATUS_IO_ACTIVE then result := result + '; The printer is in an active input/output state ';
    if Status and PRINTER_STATUS_MANUAL_FEED =PRINTER_STATUS_MANUAL_FEED then result := result + '; The printer is in a manual feed state. ';
    if Status and PRINTER_STATUS_NO_TONER =PRINTER_STATUS_NO_TONER then result := result + '; The printer is out of toner. ';
    if Status and PRINTER_STATUS_NOT_AVAILABLE =PRINTER_STATUS_NOT_AVAILABLE then result := result + '; The printer is not available for printing. ';
    if Status and PRINTER_STATUS_OFFLINE =PRINTER_STATUS_OFFLINE then result := result + '; The printer is offline. ';
    if Status and PRINTER_STATUS_OUT_OF_MEMORY =PRINTER_STATUS_OUT_OF_MEMORY then result := result + '; The printer has run out of memory. ';
    if Status and PRINTER_STATUS_OUTPUT_BIN_FULL =PRINTER_STATUS_OUTPUT_BIN_FULL then result := result + '; The printer "s output bin is full. ';
    if Status and PRINTER_STATUS_PAGE_PUNT =PRINTER_STATUS_PAGE_PUNT then result := result + '; The printer cannot print the current page. Windows 95/98/Me: Indicates the page is being "punted" (that is, not printed) because it is too complex for the printer to print. ';
    if Status and PRINTER_STATUS_PAPER_JAM =PRINTER_STATUS_PAPER_JAM then result := result + '; Paper is jammed in the printer ';
    if Status and PRINTER_STATUS_PAPER_OUT =PRINTER_STATUS_PAPER_OUT then result := result + '; The printer is out of paper. ';
    if Status and PRINTER_STATUS_PAPER_PROBLEM = PRINTER_STATUS_PAPER_PROBLEM then result := result + '; The printer has a paper problem. ';
    if Status and PRINTER_STATUS_PAUSED = PRINTER_STATUS_PAUSED then result := result + '; The printer is paused. ';
    if Status and PRINTER_STATUS_PENDING_DELETION =PRINTER_STATUS_PENDING_DELETION then result := result + '; The printer is being deleted. ';
    if Status and PRINTER_STATUS_POWER_SAVE = PRINTER_STATUS_POWER_SAVE then result := result + '; The printer is in power save mode. ';
    if Status and PRINTER_STATUS_PRINTING = PRINTER_STATUS_PRINTING then result := result + '; The printer is printing. ';
    if Status and PRINTER_STATUS_PROCESSING = PRINTER_STATUS_PROCESSING then result := result + '; The printer is processing a print job. ';
    if Status and PRINTER_STATUS_SERVER_UNKNOWN = PRINTER_STATUS_SERVER_UNKNOWN then result := result + '; The printer status is unknown. ';
    if Status and PRINTER_STATUS_TONER_LOW = PRINTER_STATUS_TONER_LOW then result := result + '; The printer is low on toner. ';
    if Status and PRINTER_STATUS_USER_INTERVENTION = PRINTER_STATUS_USER_INTERVENTION then result := result + '; The printer has an error that requires the user to do something. ';
    if Status and PRINTER_STATUS_WAITING = PRINTER_STATUS_WAITING then result := result + '; The printer is waiting. ';
    if Status and PRINTER_STATUS_WARMING_UP = PRINTER_STATUS_WARMING_UP then result := result + '; The printer is warming up. ';
    if Status = 0 then result := 'Impressora Ligada';
end;

 

Editado por William F. L.
image.png.7b12b65221605b4e2ee1b0693683f18d.png

Sistemas para Bares, Restaurantes e Varejo

https://www.wllsistemas.com.br

 

  • Fundadores
Postado

Implementação interessante... acho que podemos usá-la no ACBrPosPrinter...

Mesmo ela tendo um escopo de funcionamento bem específico, pode ser útil...

Ando ocupado com o Trunk2 e NFe... mas assim que possível, volta a analisar esse assunto...

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Postado

Entendo Daniela, mesmo sendo direcionado para impressoras em geral não sabemos se essa rotina é funcional para todos os modelos (Epson, Daruma e Bematech) que o componente ACBrPosPrinter contempla.

Postei a código na intenção que alguns colegas possam testar com outros modelos, infelizmente só tenho a Epson.

image.png.7b12b65221605b4e2ee1b0693683f18d.png

Sistemas para Bares, Restaurantes e Varejo

https://www.wllsistemas.com.br

 

  • 2 anos depois...
  • Membros Pro
Postado

Olá William.

Usei  sua rotina e como você disse na Epson-TM20, tudo tranquilo. Com uma Bematech, tive problema após o aviso de erro, mas, nada que não se pode contornar.

 

Muito bom.

 

Obrigado. 

  • Este tópico foi criado há 2323 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.