Escolher Impressora

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

Moderador: Moderadores

braz
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 08 Jan 2011 17:39
Localização: piracicaba

Escolher Impressora

Mensagem por braz »

Ola, boa tarde

Sou novo no Xharb, gostaria de saber como faço, qual o comando, para escolher uma impressora na rede ou local. obrigado
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: Escolher Impressora

Mensagem por Toledo »

Dê uma olhada nestes tópicos:

https://pctoledo.org/forum/viewto ... 485#p43485
https://pctoledo.org/forum/viewtopic.php?t=6465 (procure por GetPrinters)

Link para busca da função GETPRINTERS():
https://pctoledo.org/forum/search ... etprinters

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
braz
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 08 Jan 2011 17:39
Localização: piracicaba

Re: Escolher Impressora

Mensagem por braz »

Ja pesquisei antes de postar, mas não achei nada a respeito.

Alguem teria uma rotina em xharb para disponibilizar, para escolha de inpressoras para impressão.

agradeço

Abrçs
Avatar do usuário
jairfab
Usuário Nível 3
Usuário Nível 3
Mensagens: 252
Registrado em: 21 Mai 2007 09:43
Localização: São Paulo, Região Leste - Suzano

Re: Escolher Impressora

Mensagem por jairfab »

Cara está tudo nos link que toledo relacionou!


Mas você já utiliza alguma lib para gerar relatorios tipo WIN32PRN ou outras....?
Delpji 7, harbour 3.2, xharbour 1.2.3, Bcc7, Minigw, Minigui 19.11, hwgui 2.20, FiveWin 19.05 Gtwvw, Gtwvg, C# VS 2017
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: Escolher Impressora

Mensagem por Toledo »

Amigo, você está usando alguma lib gráfica, tipo MiniGui, HwGui, FiveWin, etc... ou seu programa é só modo texto (DOS)?

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
braz
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 08 Jan 2011 17:39
Localização: piracicaba

Re: Escolher Impressora

Mensagem por braz »

Não uso nenhuma lib Sr. Toledo, ta so com modo texto DOS mesmo.

Abraços
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Escolher Impressora

Mensagem por Pablo César »

braz escreveu:gostaria de saber como faço, qual o comando, para escolher uma impressora na rede ou local
Se a impressora em que você quer imprimir está instalada no Windows do PC que você quer para imprimir, então pode inserir este código:

Código: Selecionar todos

FUNCTION Main()
LOCAL nPrn:=1
LOCAL aPrn:= GetPrinters()
CLS
IF EMPTY(aPrn)
   Alert("Nemnhma impressora instalada !")
   QUIT
ENDIF
DO WHILE !EMPTY(nPrn)
   CLS
   @ 0,0 SAY 'Escolha uma impressora. ESC para sair.'
   @ 1,0 TO maxRow(),maxCol()
   nPrn:= ACHOICE(2,1,maxRow()-1,maxCol()-1,aPrn,.T.,,nPrn)
   IF !EMPTY(nPrn)
      // Imprimir(aPrn[nPrn]) // Função que imprime
   ENDIF
ENDDO
RETURN(NIL)
Você pediu para selecionar impressora, mas não disse como você vai querer imprimir. Em modo texto ou gráfico. Você está mandando a impressão diretamente à impressora ou está criando um arquivo de impressão. Você está usando Harbour ou xHarbour em modo console ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
braz
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 08 Jan 2011 17:39
Localização: piracicaba

Re: Escolher Impressora

Mensagem por braz »

Obrigado Pablo por responder.

É quase isso que vc fez, mas qdo escolho qualquer impressora da rede e teclo ESC a impressão sai na impressora local.
Você pediu para selecionar impressora, mas não disse como você vai querer imprimir. Em modo texto ou gráfico. Você está mandando a impressão diretamente à impressora ou está criando um arquivo de impressão. Você está usando Harbour ou xHarbour em modo console ?
Quero imprimir modo texto diretamente na impressora escolhida, estou usando Xharb.

Obrigado, abçs
Editado pela última vez por Pablo César em 12 Jan 2011 09:45, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ quote ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r0
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Re: Escolher Impressora

Mensagem por Itamar M. Lins Jr. »

Ola!
É quase isso que vc fez, mas qdo escolho qualquer impressora da rede e teclo ESC a impressão sai na impressora local.
Você precisa ler a seção, como fazer perguntas inteligentes.
Não tem como nós advinharmos algumas coisas, quanto mais voce poder explicar para nós melhor.

Por exemplo:
Usado o xHarbour 1.xx no Windows XP SP3, como fazer para imprimir em rede usando a classe WIN_PRN ?
qual o comando, para escolher uma impressora na rede ou local.
Está pergutando ou afirmando ?
No windows usando a classe PRN é sempre o mesmo comando, a impressora na estação tem que está compartilhada.
Agora se voce usa SET PRINTER TO é preciso mapear a impressora.

São comandos diferentes, como vamos advinhar ?



Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Escolher Impressora

Mensagem por Pablo César »

Itamar escreveu:Não tem como nós advinharmos algumas coisas, quanto mais voce poder explicar para nós melhor.
É... realmente está dificil de entender. Você braz faz um pedido mas não especifica o que você está fazendo para imprimir. Aí fica dificil de adivinhar... Por isso eu apenas me limitei a passar o código que seleciona impressoras, pois esse é o título do seu post. Mas vamos lá... vamos ser mais detalhistas possível, mais específicos e tentaremos te ajudar. Analisemos o que você disse:
braz escreveu:mas qdo escolho qualquer impressora da rede e teclo ESC a impressão sai na impressora local
Você escolheu ou deu um ESC ? Escolher pra mim é dar um ENTER. Veja que o exemplo que passei trata corretamente essa questão do ESC. Portanto se você fez igual ao que te passei, então não tinha por quê imprimir quando dá um ESC. Dar um ESC nessa situação é para cancelar a impressão. Certo ?
Se imprimiu, é porque você colocou no lugar errado a função de impressão. Por isso perguntei cómo você está imprimindo. E por isso o colega Itamar disse:
...para imprimir em rede usando a classe WIN_PRN...
...a impressora na estação tem que está compartilhada...
Agora se voce usa SET PRINTER TO é preciso mapear a impressora
Então se você ja tem teu código de impressão com o "SET PRINTER TO" é claro que irá imprimir na LPT1 (por geral é a impressora local) então você não precisa selecionar impressora alguma. Mas se você quer mudar essa situação, você devia ter composto a sua pergunta de forma diferente, assim nós podemos te guiar da melhor forma. Acontece que este tema de impressão é bem extenso e você precisa rever seus conceitos com xHarbour. Pois existem várias formas de imprimir. Se você quer continuar a imprimir do jeito do antigo Clipper, você terá algumas restrições, pois não toda impressora imprime em modo RAW, algumas não obedecem os comandos padrão EPSON. Então se você quer utilizar xHarbour, você deve pensar como o xHarbour trabalha e para isso você tem que ler aqueles tópicos que o Sr. Toledo passou. Se você tem pressa e não consegue digerir tanto texto e ainda quer um resultado rápido, eu sugiro você redirecionar sua impressão para arquivo de impressão e daí se as impressoras estão devidamente mapeadas é só adicionar no final do relatório, após a geração do arquivo, a seguinte linha:

Código: Selecionar todos

cSaida:="\\COMPUTADOR1\EPSON"    // digamos que a sua impressora seja esta
COPY FILE("REL001.PRN") TO (cSaida)
Pronto seria isso apenas para imprimir. Mas claro, isso após ter dado um nome e gerado o arquivo de impressão.

Aconselho que toda operação, a de impressão ou geração de arquivo de impressão, você faça uma função por separado, não faça tudo numa só função Main... pois veja a linha 15 a função "Imprimir(aPrn[nPrn])" do meu exemplo anterior. É aí que irá funcionar se você SELECIONAR uma impressora e se der ESC daí não irá imprimir, pois a variável nPrn terá valor ZERO quando der um ESC.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
braz
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 08 Jan 2011 17:39
Localização: piracicaba

Re: Escolher Impressora

Mensagem por braz »

Pablo !!
Se a pergunta lhe falta dados, é so perguntar que responderei.

Essa rotina que vc passou, se vc olhar BEM, vai perceber que se voce apertar a tecla ENTER, não irá acontecer nada, então deve estar faltando algo, voce nao acha?

A relação de impressoras está aparecendo, mas não da pra escolher.

Eu sou novo na area, se voce puder me ajudar, eu lhe agradeço.

Obrigado
Editado pela última vez por Toledo em 12 Jan 2011 17:41, em um total de 2 vezes.
Razão: Mensagem editada para retirar o QUOTE total da mensagem anterior.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: Escolher Impressora

Mensagem por Toledo »

Faz um teste com este exemplo:

Código: Selecionar todos

FUNCTION Main()
CLS
cImp:=EscolheImp()
IF !EMPTY(cImp)
  SET PRINTER TO (cImp)
  SET DEVICE TO PRINT
  @ 10,10 SAY "TESTE DE IMPRESSAO"
  @ 12,10 SAY "AQUI VOCE MONTA SEU RELATORIO"
  EJECT
  SET PRINTER TO
  SET DEVICE TO SCREEN
ENDIF
RETURN NIL


Function EscolheImp()
LOCAL nPrn:=1, cRet:="", nCol, nLin
LOCAL aPrn:= GetPrinters()
IF EMPTY(aPrn)
   Alert("Nemnhma impressora instalada !")
   RETURN (cRet)
ENDIF
nCol:=1
nLin:=IF(Len(aPrn)>10,10,Len(aPrn))
For i=1 TO Len(aPrn)
 if Len(aPrn[i])>nCol
  nCol:=Len(aPrn[i])
 endif
Next
@ 0,0 SAY 'Escolha uma impressora. ESC para sair.'
@ 1,0 TO nLin+2,nCol+1
nPrn:= ACHOICE(2,1,nLin+1,nCol,aPrn,.T.,"FUNCSEL",nPrn)
IF nPrn>0
  cRet:=aPrn[nPrn]
ENDIF
RETURN (cRet)

FUNCTION FuncSel( nMode, nElement, nRow )
LOCAL nKey := LastKey()
IF nMode==3
 IF nKey==13
  RETURN 1
 ELSEIF nKey==27
  RETURN 0
 ENDIF
ENDIF
RETURN 2
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Escolher Impressora

Mensagem por Pablo César »

Braz ,

Você é quem tem que ter paciência... ao final de contas é você quem precisa aprender. Então, vamos tentar baixar o tom de voz e focarmos ao seu problema, certo ? Pois aqui ninguém tem obrigação de responder e aqui também todos temos o direito de manifestar a nossa opinião desde que não se faça com ofensa.
braz escreveu:Essa rotina que vc passou, se vc olhar BEM, vai perceber que se voce apertar a tecla ENTER, não irá acontecer nada
Vou apenas colocar duas linhas para que você PERCEBA que o código passado, sim escolhe através de um ENTER e com ESC não.

Código: Selecionar todos

FUNCTION Main()
LOCAL nPrn:=1
LOCAL aPrn:= GetPrinters()
CLS
IF EMPTY(aPrn)
   Alert("Nenhuma impressora instalada !")
   QUIT
ENDIF
DO WHILE !EMPTY(nPrn)
   CLS
   @ 0,0 SAY 'Escolha uma impressora. ESC para sair.'
   @ 1,0 TO maxRow(),maxCol()
   nPrn:= ACHOICE(2,1,maxRow()-1,maxCol()-1,aPrn,.T.,,nPrn)
   IF !EMPTY(nPrn)
      // Imprimir(aPrn[nPrn]) // Função que imprime
      ALERT("A impressora selecionada foi "+aPrn[nPrn])
   ELSE
      ALERT("Valor da variavel nPrn ‚ "+ALLTRIM(STR(nPrn))+". Portanto nenhuma impressora selecionada !")
   ENDIF
ENDDO
RETURN(NIL)
Acredito que você está conseguindo compilar o exemplo, mas de todas formas disponibilizei o executável para você conferir. Depois disso, me diga se o código que te passei, escolhe ou não a impressora instalada através do ENTER.
Anexos
seleimp.zip
(372.2 KiB) Baixado 180 vezes
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
braz
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 08 Jan 2011 17:39
Localização: piracicaba

Re: Escolher Impressora

Mensagem por braz »

Sr. Toledo.

Mais uma vez, obrigado pela atenção.

Testei a rotina do Sr. e escolho uma impressora da rede (uma HP laser que está instalada em outro PC), so que a impressão sai na minha impressora local. Pelo NODOSIMP eu consigo imprimir em qualquer impressora, mas segundo me disseram com o Xharbour nao precisaria mais usar o NODOSIMP.

Abraços,
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: Escolher Impressora

Mensagem por Toledo »

Braz, antes de mais nada, procure ler suas MPs (Mensagens Privadas)... para isto entre na opção "Mensagens Privadas Novas:" que está na parte superior desta janela.

Olha, eu não tenho como fazer testes aqui, pois minhas impressoras na rede estão configuradas por IP, e eu não tenho certeza se o comando SET PRINTER aceita endereço de IP. Então se sua impressora estiver configurada atraves de uma caminho normal na rede, tipo: \\servidor\nomeimpressora, acho que este novo código vai dar certo.

Código: Selecionar todos

FUNCTION Main()
CLS
cImp:=QualImp()
IF !EMPTY(cImp)
 SET PRINTER TO (cImp)
 SET DEVICE TO PRINT
 @ 10,10 SAY "TESTE DE IMPRESSAO"
 @ 12,10 SAY "AQUI VOCE MONTA SEU RELATORIO"
 EJECT
 SET PRINTER TO
 SET DEVICE TO SCREEN
ENDIF
RETURN NIL


Function QualImp()
LOCAL nPrn:=1, cRet:="", nCol, nLin
LOCAL aPrn:= GetPrinters(.T.)
IF EMPTY(aPrn)
   Alert("Nemnhma impressora instalada !")
   RETURN (cRet)
ENDIF
nCol:=1
nLin:=IF(Len(aPrn)>10,10,Len(aPrn))
aImp:={}
For i=1 TO Len(aPrn)
 if Len(aPrn[i,1])>nCol
  nCol:=Len(aPrn[i,1])
 endif
 AADD(aImp,aPrn[i,1])
Next
@ 0,0 SAY 'Escolha uma impressora. ESC para sair.'
@ 1,0 TO nLin+2,nCol+1
nPrn:= ACHOICE(2,1,nLin+1,nCol,aImp,.T.,"FUNCSEL",nPrn)
IF nPrn>0
  IF LEFT(aPrn[nPrn,2],2)=="\\"
   cRet:=aPrn[nPrn,2]
  ELSE
   cRet:=aPrn[nPrn,1]
  ENDIF
ENDIF
RETURN (cRet)

FUNCTION FuncSel( nMode, nElement, nRow )
LOCAL nKey := LastKey()
IF nMode==3
 IF nKey==13
  RETURN 1
 ELSEIF nKey==27
  RETURN 0
 ENDIF
ENDIF
RETURN 2
Outra coisa, procure analisar e entender o código que estamos lhe passando, isto será ótimo para o seu aprendizado.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Responder