Funçao ISPRINTER()

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Funçao ISPRINTER()

Mensagem por microvolution »

asimoes escreveu:Mas esse código deve ajudar:
infelizmente não sei o que é, mas, o seu código (último postado) também não deu certo...
o clipper/harbour manda para a impressora lptx e não importa se:
- existe uma impressora matricial ou não;
- está ligada ou não;
- tem cabo paralelo ou não.
Não entendo isso!
Pois antes de migrar o negócio funcionava perfeitamente, tanto no win 9x quanto no win xp... não mudei nada no código, aliás, só acrescentei funções incluindo a win_prn para no caso de não haver uma lptx instalada.
Muito estranho, pois no win 10 isso está funcionando como era antes.
Outra coisa mais estranha ainda?!
Testei até uma versão que tenho aqui que ainda está 100% clipper e funcionou de forma errada também, ou seja, o isprinter() está retornando como .t. (como se estivesse uma impressora lptx na porta e ligada)
tô doido sô!!! :%
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Funçao ISPRINTER()

Mensagem por asimoes »

Meu amigo ainda bem que tem o google dê uma pesquisada.
Como eu disse o XP parou de receber manutenção e os bugs não serão resolvidos.
Pensa nisso.
Convença o seu usuário atualizar o S.O.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Funçao ISPRINTER()

Mensagem por microvolution »

Prezados, mais uma informação, ou melhor algumas.
No chutômetro, pesquisei no site oficial do professor JQuintas (harbourdoc.com.br) tudo que tinha na pesquisa como "print". Achei várias funções. Resolvi testar as seguintes:

Código: Selecionar todos

  setcolor('r/n')
      @ 05,10 SAY "os" 
      ? OS()
      ? "isprinter()",isprinter()
      ? "ft_isprint()",ft_isprint()
      ? "hb_IsPrinter()",hb_IsPrinter()
      ? "isprint()",isprint() // funcionou no win xp
      ? "sprintf()",sprintf()
      ? "PrintReady(1)",PrintReady(1) // 1= lpt1 - 2= lpt2 - 3= lpt3
      // @ 14,10 say PrintStatus()
      ? "PrinterExists()",PrinterExists() // funcionou no win xp
      ? "PrinterPortToname()",PrinterPortToname()
      ? "XIsPrinter()",XIsPrinter()
      // ? "ERR_print_errors(BIO_new_fd( 1, HB_BIO_NOCLOSE ))",ERR_print_errors(BIO_new_fd( 1, HB_BIO_NOCLOSE ))
      ? "NetPrinter()",NetPrinter() // funcionou no win xp
      wait "impressão teste fim... ENTER"
As linhas acima, ao compilar deu tudo certo. Então os resultados foram os seguintes:
- as 2 linhas comentadas, pra funcionar tive que adicionar as libs "hbfoxpro.hbc e hbssl.hbc";
- no windows 10 (64 bits) todas as linhas se comportaram corretamente, ou seja, apresentaram que não tinha nenhuma impressora paralela ligada no momento (.f. ou nil ou 0);
- no win xp (32 bits) a maioria apresentou um falso-positivo, ou seja, deu como resultado que tinha uma impressora paralela ligada (.t.);
- as funções abaixo:

Código: Selecionar todos

      ? "isprint()",isprint() // funcionou no win xp
      ? "PrinterExists()",PrinterExists() // funcionou no win xp
      ? "NetPrinter()",NetPrinter() // funcionou no win xp
por sua vez, apresentaram como .f., ou seja, retornaram como não haviam impressoras paralelas ligadas no momento.
Com isso, optei e fiz o teste final com apenas uma das 3, e, foi a que leva o nome mais aproximado (por coincidência ou não) da antiga função ISPRINTER() que é a primeira desta última lista: "ISPRINT()";
- Então, fiz a modificação em meu código e DEU TUDO CERTO.
Agora só pra finalizar minha participação (por enquanto) neste tópico:
- 1ª ) uma das libs no windows 10 funcionou também corretamente, mas, no win xp, foi necessário colocar na pasta de instalação do meu sistema a lib "libeay32.dll" da pasta hb34\bin, pois senão o aplicativo (.exe) não executava e apresentava uma mensagem de erro. Então, preferi eliminar esta função, diante de várias que usei;
- 2ª ) para não ter que ficar incomodando o usuário final do meu sistema, fiz algumas linhas que, se houver uma impressora lptx instalada (matricial) ligada a impressão vai direto pra ela numa boa. Mas, se a impressora estiver desligada, enquanto não ligar a impressora ou o usuário manualmente não responder à seguinte pergunta com a resposta NÃO, o sistema fica em loop:
"A impressora matricial está desligada ? SIM/NÃO?"
... então Se o usuário responder com não, aí sim é feita nova pergunta:
"Deseja usar impressora alternativa (usb, wi fi, rede, etc) ?"
Com a resposta NÃO, a impressão é realmente cancelada, mas, se a resposta for SIM, aí sim abre-se uma tela, ou melhor, um browse (achoice) com as impressoras usb ou da rede instaladas, e, o usuário pode optar por uma delas ou ainda o CutePDF (tudo através do WIN_PRN).

Bom, resumindo...
Quem está com problemas no ISPRINTER() dando falso-positivo como eu, no windows XP, substituam pela função:
ISPRINT()
Abraços!
Não foi necessário o google, no site harbourdoc.com.br do nosso amigo, colaborador e professor JQuintas foi o suficiente. O google está aí pra todos nós, e, graças a Deus, temos aqui o PCTOLEDO.COM.BR/FORUM com quase tudo que precisamos, incluindo os melhores professores, colaboradores, no clipper no Brasil...
viva o nosso barco no porto seguro: clipper/harbour!
:))
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Funçao ISPRINTER()

Mensagem por asimoes »

Mas continuo afirmando: hoje você resolveu em parte o problema da impressora no XP e amanhã?
Pensa nisso!
A não ser que você congele a sua versão do harbour, não atualize nunca mais, mas corre o risco de funcionar em parte no XP e começar apresentar erros em versões mais atuais do windows.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Funçao ISPRINTER()

Mensagem por asimoes »

Amiguinho,

IsPrint("LPT1") no windows 10 retorna .T., só que que no meu notebook não tem nenhuma porta lptx, e tem que passar parâmetro para função:

Veja o tópico: https://pctoledo.org/forum/viewto ... int#p91827
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Funçao ISPRINTER()

Mensagem por asimoes »

Outra coisa, olhando o changelong.txt PrinterExists agora é WIN_PRINTEREXISTS foi feito um translate só para compatibilizar o uso da função.
Mas a função espera um parâmetro: tanto hb_isprinter e win_printerexists

l1:=HB_isPrinter("LPT1")
L2:=win_PrinterExists("LPT1")
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Funçao ISPRINTER()

Mensagem por fladimir »

Sem querer desanimar, pq posso estar errado, mas na época testei de tudo quanto foi jeito q pude, e o q melhor resolveu foi o Try Catch.
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Funçao ISPRINTER()

Mensagem por asimoes »

Fladimir,

Fui eu quem sugeriu o uso do try..catch mas o nosso amigo diz que no XP retorna .T., tenho pra mim que deve ter alguma coisa errada neste Xp, pode ser até um net use lpt1
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Funçao ISPRINTER()

Mensagem por microvolution »

asimoes escreveu:Mas continuo afirmando: hoje você resolveu em parte o problema da impressora no XP e amanhã?
olá professor, estou tentando pensar.
Como assim? pois se a função ISPRINT() funcionou no meu harbour 3.4 no windows xp 32 bits e também no win 10 64 bits, qual o problema?
Já que o win xp não vai mais ser alterado, então não teremos problemas com incompatibilidade, correto?
asimoes escreveu:... ISPRINT() ...e tem que passar parâmetro para função:
No meu caso, funcionou do mesmo jeito que eu já fazia com a anterior que funcionava ISPRINTER().
Uso um loop do/while condicionado ao ESC e ao .not. isprint(), ou seja, sem qualquer argumento dentro da função, que retorna .f. se a impressora não estiver ligada.
asimoes escreveu:hb_isprinter e win_printerexists
Não testei na prática essas duas funções, somente a ISPRINT() e como já disse, deu certo. Inclusive fui hoje em um novo cliente e lá win 10 (não sei se é 32 ou 64) a função retornou corretamente, pois o cliente não tem lptx e sim uma multifuncional, significando que deu certo, ou seja, está do jeito que eu preciso (até aprender um pouco mais com os prezados professores e mudar o código, para ficar melhor).
fladimir escreveu:Sem querer desanimar, pq posso estar errado, mas na época testei de tudo quanto foi jeito q pude, e o q melhor resolveu foi o Try Catch.
Prezado professor "fladimir" obrigado por comentar. Infelizmente, pode olhar nas minhas postagens aqui, e, comigo não funcionou o try...
asimoes escreveu:errada neste Xp, pode ser até um net use lpt1
ah" sim, isso não observei - confesso meu pecado!
Segunda-feira, se Deus permitir, olharei e retornarei com sim ou não. Ou melhor, na mesma segunda, irei num cliente onde são 5 computadores:
- 3 com win xp 32 bits;
- 1 com win 7 32 bits;
- 1 com win 2k3 server (sendo o servidor A.D.) onde está todas as minhas pastas e o sistema instalado.
Ah! é possível - durante a instalação do meu sistema, instalar junto o "cutepdf" e o "converter"
para não ser necessário baixá-los na internet individualmente em cada cliente?
Ou seja, já quero que independente de cliente querer ou não, já apareça na lista de impressoras o cutepdf para ele optar.
abraços e Bfds CLIPPAHarbourADO


Obrigado por tudo!
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Funçao ISPRINTER()

Mensagem por microvolution »

fladimir escreveu:Sem querer desanimar, pq posso estar errado, mas na época testei de tudo quanto foi jeito q pude, e o q melhor resolveu foi o Try Catch.
asimoes escreveu:Fui eu quem sugeriu o uso do try..catch mas o nosso amigo diz que no XP retorna .T., tenho pra mim que deve ter alguma coisa errada neste Xp, pode ser até um net use lpt1
quase um mês se passou e tenho que concordar com os Srs...
como aqui no meu laboratório de desenvolvimento tenho win xp 32 e win 10 64, mas, a impressora LX 300 está com defeito... pensei que estava funcionando corretamente... mas não está...
tudo o que postei anteriormente e testei ou não funciona nada ou dá um falso-positivo.
Então meu cliente me chamou...
fui lá e peguei uma das impressoras lx300 dele emprestada...
aí qualquer das funções que funcionam retornam o seguinte:
se existe uma instalação de lpt1 e está ligada o resultado é .t.
se existe uma instalação de lpt1 e está DESligada o resultado é .t.
Ou seja, a informação continua errada...
Então prezado professor fladimir e asimoes... como é esse tal try.cach?
vlw!
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Funçao ISPRINTER()

Mensagem por microvolution »

de repente alguém tem uma solução...
Hoje em dia no meu sistema já imprimo (meia boca ainda) em USB, usando o WinPrn() do harbour...
Então preciso realmente do seguinte:
1 - Se o cliente possui numa das portas LPTx alguma impressora instalada, então, o sistema decide por imprimir em LPTx e usando o @prow e os códigos @ESC da impressora... com isso a impressão é como antigamente (antes de existir USB), e, a velocidade é da impressora.
2 - Agora se o cliente não possuir uma LPTx e sim uma LASER ou JATO/TINTA, aí sim, abre a lista de impressoras, tais como:
HP, CUTE PDF, etc...

É por isso que esse ISPRINTER() é necessário, pra informar, em caso da LX 300 (lptx) der problema, ele não ficar sem impressão...
Imprimindo pelo WINPRN mesmo em LX300 a impressão não é usando os códigos da impressora e sim os do windows, e, sabem o que acontece?
a Impressora imprime com os 2 LEDs ligados, ou seja, é como se fosse um ROMAN, e, não é uma impressão rápida como o DRAFT... aí, sabe o que acontece?
O cliente "xiou"!
E, agora, quem poderá me defender?
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Funçao ISPRINTER()

Mensagem por asimoes »

De Paula, tudo é uma questão de olhar os tópicos com cuidado.
A informação do try..catch estava neste assunto na página 3

Código: Selecionar todos

try
   SET DEVICE TO PRINTER 
   SET PRINTER TO LPT1
   SET PRINT ON
catch
   Alert("Erro, impressora off-line")
end
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Funçao ISPRINTER()

Mensagem por rochinha »

Amiguinhos,

Vamos ver se ajuda:

Código: Selecionar todos

...
  do case
     case GetPrintDefault()=0 .and. empty( GetPrinter() )
          ? "Nenhuma impressora esta instalada."
     case GetPrintDefault()=0 .and. !empty( GetPrinter() )
          ? "Servico de Spool esta desativado ou nenhuma impressora como padrao."
     case GetPrintDefault()<>0
          aPrinter := GetPrinters()
          for i = 1 to len(aPrinter)
              cPrinter := aPrinter[i]
              cPort    := substr(cPrinter,at(",",cPrinter)+1,20)
              if MsgYesNO( "Colocar impressora " + cPrinter + " como padrao?" )
                 SetPrintDefault( substr(cPrinter,1,at(",",cPrinter)-1) )
                 PrinterInit()
                 //SetDefaultPrinter( substr(cPrinter,1,at(",",cPrinter)-1) )
              endif
          next
  endcase
...
Funções:

Código: Selecionar todos

FUNCTION GetPrinter()
   local cString
   cString:= GetProfString( "windows", "device" , "" )
   cString:= left(cString,at(",",cString)-1)
   return cString
   
FUNCTION GetPrinters()
   Local aPrinter := {}
   Local cAllEntries
   Local cEntry
   Local nStart
   Local cName
   Local cPrn
   Local cPort
   Local nJ 
   cAllEntries := STRTRAN( GetProfString( "Devices" ), Chr( 0 ), CRLF )
   For nStart := 1 To MlCount( cAllEntries )
       cName := MemoLine( cAllEntries,,nStart)
       cEntry := GetProfString( "Devices",cName,"")
       nJ := 2
       Do While ! Empty(cPort := StrToken(cEntry,nJ++,","))
          Aadd(aPrinter,Trim(cName)+" , "+Trim(cPort))
       EndDo
   Next
   Return(aPrinter)
  
FUNCTION SetPrinter(cPrinter)
   local cOldPrinter:="", hDC:=0, aPrn, cText:="", lSuccess:=.f.
   if cPrinter <> GetPrinter()
      cText := StrTran(GetProfString("Devices"),Chr(0), chr(13)+chr(10))
      aPrn  := Array(Mlcount(cText, 250))
      Aeval(aPrn, {|v,e| aPrn[e] := Trim(Memoline(cText, 250, e)) } )
      if  ascan(aPrn,cPrinter) > 0
         cOldPrinter := GetProfString( "windows", "device" , "" )
         WriteProfString( "windows", "device", cPrinter )
         SysRefresh()
         PrinterInit()
         hDC := GetPrintDefault( GetActiveWindow() )
         if hDC>0
            lSuccess:= resetDC( hDC )
         endif
         SysRefresh()
         WriteProfString( "windows", "device", cOldPrinter  )
      endif
   endif
   RETURN lSuccess
OBS: Não consegui sucesso com a função SetPrinter() e SetPrintDefault().
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Funçao ISPRINTER()

Mensagem por microvolution »

rochinha escreveu:GetProfString
não entendi muito bem seu código prezado professor... a começar por esta função. É nativa do harbour?
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Funçao ISPRINTER()

Mensagem por microvolution »

rochinha escreveu:Vamos ver se ajuda:
e tem mais professor Rochinha...
fuçando no fórum descobri este link criado por V.Sa. : https://pctoledo.org/forum/viewto ... 03#p104003 e este outro aqui também: https://pctoledo.org/forum/viewto ... =4&t=11842 no MagnoMan... em ambos o nobre professor se referencia a uma função (dizendo nativa) do harbour :
PrnStatus
Mas, ela dá a chata mensagem:
Undefined Reference ...
qual LIB incluo no .HBC ou qual #include no .PRG?
Quem sabe essa função é a solução para nossos problemas!
:))
abraços
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
Responder