Página 1 de 1

Listagens de Impressoras

Enviado: 02 Mai 2015 12:54
por Josmar dos Santos
Esse assunto é continuação de um outro tópico, mas conforme orientação do "PC Toledo", abri esse outro para não dar confusão.

Através da ajuda de vocês já caminhei bastante nessa minha luta para fazer a conversão. Passei a noite em claro e consegui resolver vários probleminhas, só que agora caí em outra situação: No velho Clipper, o mesmo captava todas as impressoras da rede, porém no Harbour está mostrando uma listagem que eu desconheço. Talvez os colegas entendam melhor o que está acontecendo(Num faço a melhor ideia do que é isso). Eu confesso a vocês que não tenho um grande domínio de programação dessa linguagem. Por isso conto muito com a ajuda desse fórum para resolver esses probleminhas. Como as imagens fala melhor do que 1000 palavras, resolvi colocar as duas imagens:


Feito no CLIPPER....Está perfeito do jeito que eu quero.

Imagem


Feito no Harbour....Listagem sem sentido.

Imagem


Código:

Código: Selecionar todos

 FUNCTION FUN_IMP1
DO CASE
   CASE LASTKEY()=27
        RETURN 0
   CASE LASTKEY()=-1
        VSTRING=SPACE(78)
        SET CURSOR ON
        @ 24,11 SAY "Procurar por: "
        @ 24,25 GET VSTRING PICT "@S44"
        READ
        SET CURSOR OFF
        IF !LASTKEY()=27
           IF !EMPTY(VSTRING)
              LOCATE FOR UPPER(ALLTRIM(VSTRING)) $ &(VINDEX)
              IF FOUND()
                 FOR I=1 TO FCOUNT()
                     IF ALLTRIM(VSTRING) $ FIELDGET(I)
                        KEYBOARD CHR(26)+REPLICATE(CHR(4),I-1)
                        EXIT
                     ENDIF
                 NEXT
              ENDIF
           ENDIF
        ENDIF
   CASE LASTKEY()=-2 .AND. VALTYPE(VSTRING)="C"
        SKIP
        LOCATE REST FOR ALLTRIM(VSTRING) $ &(VINDEX)
        IF FOUND()
           FOR I=1 TO FCOUNT()
               IF ALLTRIM(VSTRING) $ FIELDGET(I)
                  KEYBOARD CHR(26)+REPLICATE(CHR(4),I-1)
                  EXIT
                ENDIF
           NEXT
        ELSE
           KEYBOARD CHR(0)
        ENDIF
   CASE LASTKEY()=-5 // F6
        FICA:=.T.
        DO WHILE FICA=.T.
           nVias:=1
           cTela2:=SAVESCREEN(20,33,23,48)
           GWEXPLODE(20,34,22,46,200,"T","BG+/B")
           MENSAGEM("Informe a quantidade de vias a serem impressas")
           @ 20,35 SAY PADC(" N§ vias ",9,"Ä") COLOR "BG+/B"
           SET CURSOR ON
           @ 21,39 GET nVias PICT "9" COLOR "W+/N"
           READ
           IF LASTKEY()=27
              FICA:=.F.
           ELSE
              IF nVias=0
                 if alert("Deseja cancelar a impress„o ?",{"N„o","Sim"})=2
                    return 1
                 endif
              ELSE
                 FICA:=.F.
              ENDIF
           ENDIF
           SET CURSOR OFF
           RESTSCREEN(20,33,23,48,cTela2)
        ENDDO
        if IMPRESSORA="Impressora"
           aPrinters:=GETPRINTERS(.T.)
           VT:=LEN(aPrinters)
           IF VT=0
              IMPRESSORA:="Paralela (local)"
              cImp:="LPT1" /* ou p/impres.em rede colocando o caminho:
                              cImp:="\\pc3\epson
                           */
              FOR I=1 TO nVias
                  COPY FILE(ARQUIVO+".PRN") TO (cImp)
              NEXT
           ELSEIF VT=1
              IMPRESSORA:=aPrinters[1,2]
              cImp:=CHARREM(":",aPrinters[1,3])
           ELSE
              aImpressora:={}
              FOR I=1 TO VT
                  AADD(aImpressora,aPrinters[I,2]) // Controi VETOR da MATRIZ
              NEXT
              cColor:=SETCOLOR()
              ctela1:=SAVESCREEN(14,15,23,64)
              JANELA1(14,16,VT+15,63,"Selecao de impressora")
              SETCOLOR(CONTECOR[4])
              IF (OP:=ACHOICE(15,17,22,62,aImpressora))!=0
                 IMPRESSORA:=aImpressora[OP]
                 cImp:=CHARREM(":",aprinters[OP,3])
              ELSE
                 // Verifica qual ‚ a impressora padrão
                 OP:=0
                 FOR I=1 TO VT
                     IF aPrinters[I,1] := .T.
                        OP:=I
                     ENDIF
                 NEXT
                 IMPRESSORA:=aPrinters[OP,2]
                 cImp:=CHARREM(":",aPrinters[OP,3])
              ENDIF
              SETCOLOR(cColor)
              RESTSCREEN(14,15,23,64,ctela1)
           ENDIF
        endif
        DELETE FILE("LOG.TXT")
        SWPRUNCMD("WAPI -PRINT:"+CHR(34)+IMPRESSORA+CHR(34)+";"+CHR(34)+ARQUIVO+".PRN"+CHR(34)+";"+CHR(34)+"Clientes - Tipo Ficha"+CHR(34)+";F;"+CHR(34)+"A"+CHR(34)+";F;"+str(nVias,1,0)+";F;LOG.TXT",0,"","")
        lSucesso:=.f.
        IF FILE("LOG.TXT")
           IF ALLTRIM(MEMOREAD("LOG.TXT"))="0"
              lSucesso:=.t.
           ENDIF
           DELETE FILE("LOG.TXT")
        ENDIF
        IF lSucesso:=.f.
           ALERT("Falha na tentativa de impressao")
        ENDIF
   CASE LASTKEY()=1
        GOTO TOP
   CASE LASTKEY()=6
        GOTO BOTT
ENDCASE
@ VULT_POS,78 SAY CHR(176) COLOR "W+/B"
VULT_POS=3+(((RECNO()*100)/VQUAN_REG)/5)
IF RECNO()=1
   VULT_POS=3
ENDIF
IF VULT_POS=23
   VULT_POS=22
ENDIF
@ VULT_POS,78 SAY CHR(219) COLOR "GR+/B"
RETURN 1
Por favor me ajudem...só está faltando isso para finalizar o mesmo..


Josmar

Listagens de Impressoras

Enviado: 02 Mai 2015 14:29
por sygecom
mude de:
GetPrinters(.t.)
para:
GetPrinters(.t.,.f.)

Listagens de Impressoras

Enviado: 02 Mai 2015 15:55
por Josmar dos Santos
Boa tarde Leonardo, fiz o teste, mas infelizmente não funcionou :( !!!..Mas to tentando fazer outros testes e estou aberto a mais idéias de vocês para fazer o mesmo funcionar...

Desde já agradeço...

Josmar

Listagens de Impressoras

Enviado: 02 Mai 2015 16:17
por sygecom
Josmar,
Você está listando as portas e deveria listar os nomes.
mude de:
aPrinters[1,2]
para:
aPrinters[1,1]

aPrinters:=GETPRINTERS(.T.,.F.)

Devolve:
aPrinters[1,1] // nome da impressora
aPrinters[1,2] // porta da impressora
aPrinters[1,3] // tipo (local ou rede)
aPrinters[1,4] // driver da impressora

Listagens de Impressoras

Enviado: 02 Mai 2015 17:02
por Josmar dos Santos
Fiz as alterações conforme sua orientação e também não obtive sucesso...

Uma curiosidade: Por que no clipper funciona e no Harbour não?


Josmar

Listagens de Impressoras

Enviado: 02 Mai 2015 18:43
por Toledo
Josmar dos Santos escreveu:Uma curiosidade: Por que no clipper funciona e no Harbour não?
Não sei qual é a função que você está usando no Clipper para retorna as informações sobre as impressoras, mas com certeza os dados retornados são diferentes. Conforme o Leonardo informou, no Harbour a função GetPrinters retorna uma matriz com os seguintes dados:
sygecom escreveu:Devolve:
aPrinters[1,1] // nome da impressora
aPrinters[1,2] // porta da impressora
aPrinters[1,3] // tipo (local ou rede)
aPrinters[1,4] // driver da impressora
Então na linha 80 do seu código acima, troque:

Código: Selecionar todos

AADD(aImpressora,aPrinters[I,2])
por:

Código: Selecionar todos

AADD(aImpressora,aPrinters[I,1])
Atenção: devido a esta nova estrutura da matriz aPrinters, outras linhas do seu código tem que ser alterado, por exemplo na linha 75, 76, 88 e da linha 91 até 98 (no Harbour existe uma função específica para pegar a impressora padrão, veja: GetDefaultPrinter()).

tags: GetPrinters PrintFileRaw GetDefaultPrinter

Abraços,

Listagens de Impressoras

Enviado: 02 Mai 2015 19:10
por Josmar dos Santos
OK...Toledo..Problema resolvido, bastou fazer essa alteração que vc me orientou e as impressoras da rede voltaram a aparecer como no CLipper...

:))

Que Deus abençoe a todos vocês aqui do fórum...


Josmar