Página 1 de 2
Escolher Impressora
Enviado: 08 Jan 2011 17:43
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
Re: Escolher Impressora
Enviado: 08 Jan 2011 18:53
por Toledo
Re: Escolher Impressora
Enviado: 11 Jan 2011 12:02
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
Re: Escolher Impressora
Enviado: 11 Jan 2011 13:53
por jairfab
Cara está tudo nos link que toledo relacionou!
Mas você já utiliza alguma lib para gerar relatorios tipo WIN32PRN ou outras....?
Re: Escolher Impressora
Enviado: 11 Jan 2011 14:13
por Toledo
Amigo, você está usando alguma lib gráfica, tipo MiniGui, HwGui, FiveWin, etc... ou seu programa é só modo texto (DOS)?
Abraços,
Re: Escolher Impressora
Enviado: 11 Jan 2011 17:57
por braz
Não uso nenhuma lib Sr. Toledo, ta so com modo texto DOS mesmo.
Abraços
Escolher Impressora
Enviado: 11 Jan 2011 18:31
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 ?
Re: Escolher Impressora
Enviado: 12 Jan 2011 09:08
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
Re: Escolher Impressora
Enviado: 12 Jan 2011 09:27
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.
Escolher Impressora
Enviado: 12 Jan 2011 10:18
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.
Re: Escolher Impressora
Enviado: 12 Jan 2011 14:38
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
Re: Escolher Impressora
Enviado: 12 Jan 2011 18:56
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,
Escolher Impressora
Enviado: 12 Jan 2011 20:24
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.
Re: Escolher Impressora
Enviado: 13 Jan 2011 08:31
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,
Re: Escolher Impressora
Enviado: 13 Jan 2011 09:39
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,