Rochinha, cheguei a criar um programa de teste. Este programa puxa os CHRs de um arquivo QRCHR.TXT que na verdade é um INI.
Código: Selecionar todos
/*
hbmk2 qrchr hbct.hbc -gui -gtwvg -compr=max hbwin.hbc
*/
/*
* Autor: Andril NSI SISTEMAS
*/
#include "hbgtinfo.ch"
set stat off
set scor off
set talk off
HB_GtInfo( HB_GTI_RESIZABLE, .T. )
screenWidth := HB_GTINFO( HB_GTI_DESKTOPWIDTH )
screenHeight:= HB_GTINFO( HB_GTI_DESKTOPHEIGHT )
wvt_SetFont( "Lucida Console", Round(( screenHeight / MaxRow() ),0)-3, Round(( screenWidth / MaxCol() ),0), 0 )
WVT_MAXIMIZE()
aFab:={}
/* AGORA VAMOS USAR O ARQUIVO QRCHR.TXT PARA CARREGAR OS COMANDOS CHR
aadd(aFab, {"EPSON","CHR(29)+'(k'+CHR(4)+CHR(0)+'1A2'+CHR(0)+CHR(29)+'(k'+CHR(3)+CHR(0)+'1C'+CHR(4)+CHR(29)+CHR(0)+'1E0'+CHR(29)+'(k'+CHR(157)+CHR(1)+'1P0'+MEUTEXTO+CHR(29)+'(k'+CHR(3)+CHR(0)+'1Q0'"})
aadd(aFab, {"DIEBOLD","CHR(29)+'(k'+CHR(3)+CHR(0)+'1E0'+CHR(29)+'(k'+CHR(28)+CHR(0)+'1P0'+MEUTEXTO+CHR(29)+'(k'+CHR(3)+CHR(0)+'1Q0'"})
aadd(aFab, {"BEMATECH1","CHR(29)+'kQ'+CHR(0)+CHR(8)+CHR(0)+CHR(1)+CHR(25)+CHR(0)+MEUTEXTO"})
aadd(aFab, {"BEMATECH2","CHR(29)+'kQ'+CHR(0)+CHR(8)+CHR(0)+CHR(1)+CHR(154)+CHR(1)+MEUTEXTO"})
aadd(aFab, {"DARUMA","CHR(27)+CHR(129)+CHR(27)+CHR(0)+CHR(4)+CHR(0)+MEUTEXTO"})
aadd(aFab, {"ELGIN","CHR(29)+'o'+CHR(0)+CHR(4)+CHR(0)+CHR(2)+CHR(29)+'k'+CHR(11)+'LA,'+MEUTEXTO"})
aadd(aFab, {"VOX","CHR(2)+CHR(29)+'k'+CHR(11)+'LA,'+MEUTEXTO"})
aadd(aFab, {"EPSONP2","CHR(27)+'@'+CHR(15)+CHR(10)+MEUTEXTO"})
aadd(aFab, {"CUSTOMPOS","CHR(29)+'(k'+CHR(3)+CHR(0)+'1A'+CHR(0)+CHR(29)+CHR(29)+'(k'+CHR(3)+CHR(0)+'1B'+CHR(4)+CHR(27)+'(k'+CHR(3)+CHR(0)+'1E'+CHR(0)+CHR(29)+'(k'+CHR(28)+CHR(0)+'1P1'+MEUTEXTO+CHR(29)+'(k'+CHR(3)+CHR(0)+'1Q1'"})
aadd(aFab, {"POSSTAR","CHR(29)+'(k'+CHR(4)+CHR(0)+'1A2'+CHR(0)+CHR(29)+'(k'+CHR(3)+CHR(0)+'1C'+CHR(4)+CHR(29)+'(k'+CHR(3)+CHR(0)+'1E0'+CHR(29)+'(k'+CHR(28)+CHR(0)+'1P0'+MEUTEXTO+CHR(29)+'(k'+CHR(3)+CHR(0)+'1Q0'"})
aadd(aFab, {"ZGIANQ","CHR(27)+'Z'+CHR(0)+'L'+CHR(4)+CHR(25)+CHR(0)+MEUTEXTO"})
aadd(aFab, {"GPRINTER","CHR(29)+'(k'+CHR(4)+CHR(0)+'1A2'+CHR(0)+CHR(29)+'(k'+CHR(3)+CHR(0)+'1C'+CHR(4)+CHR(29)+'(k'+CHR(3)+CHR(0)+'1E0'+CHR(29)+'(k'+CHR(28)+CHR(0)+'1P0'+MEUTEXTO+CHR(29)+'(k'+CHR(3)+CHR(0)+'1Q0'"})
aadd(aFab, {"DATECS","CHR(29)+'S'+CHR(0)+CHR(29)+'Q'+CHR(6)+CHR(4)+CHR(1)+CHR(25)+CHR(0)+MEUTEXTO"})
aadd(aFab, {"SWEDA","CHR(29)+'(k'+CHR(4)+CHR(0)+'1A2'+CHR(0)+CHR(29)+'(k'+CHR(3)+CHR(0)+'1C'+CHR(4)+CHR(29)+CHR(0)+'1E0'+CHR(29)+'(k'+CHR(157)+CHR(1)+'1P0'+MEUTEXTO+CHR(29)+'(k'+CHR(3)+CHR(0)+'1Q0'"})
*/
arq="QRCHR.TXT"
if !file(arq)
Alert("Falta arquivo QRCHR.TXT! Coloque o arquivo no diretorio.")
quit
endif
aPortas:={"LPT1:","LPT2:","LPT3:","LPT4:","LPT5:","COM1:","COM2:","COM3:","COM4:","COM5:","\\WIN7NOVO\PDFCREATOR:"}
SETMODE(25,80)
set colo to w+/n
cls
SetBlink(.T.)
cFab:=space(30)
cPorta:=space(80)
cTxt1:=space(70)
cTxt2:=space(70)
@00,00 SAY padc("QRCODE - TESTE PARA IMPRESSORAS TERMICAS 48 COLUNAS",80) colo "gr+/b"
@23,00 to 23,80
@24,00 SAY padl("Fontes C:\NOVADE32\TESTES\QRCHR",80) colo "w/n"
carregarini=.t.
DO WHILE .T.
if carregarini=.t.
aFab:={}
aRetorno:=iniToarray(arq,350)
for i=1 to len(aRetorno)
if substr(aRetorno[i],1,1)="["
cFab_=strtran(aRetorno[i],"[","")
cFab_=strtran(cFab_,"]","")
//? left(cFab,70)
aadd(aFab,left(alltrim(cFab_),30))
endif
next
carregarini=.f.
cFab:=space(30)
endif
SETCURSOR(3)
@03,12 SAY "Fabricante.......: " get cFab pict"@!" valid indFab(04,33,@cFab)=.t.
@03,62 SAY CHR(25)
@04,12 SAY "Imprimir na Porta: " get cPorta pict"@!s30" valid indPorta(05,33,@cPorta)=.t.
@04,62 SAY CHR(25)
@07,04 SAY " Texto para montar o QRCODE " colo "b/w*"
@08,04 get cTxt1
@09,04 get cTxt2
READ
if lastkey()=27
pos = alert("Deseja sair do programa?",{"Sim","Nao"},"N/W*,W+/B")
if pos=1
EXIT
endif
LOOP
elseif lastkey()=3
carregarini=.t.
alert("O arquivo "+arq+" sera recarregado!",NIL,"N/W*,W+/B")
LOOP
endif
erros=""
if empty(cFab)
erros+="Informe o Fabricante;"
endif
if empty(cPorta)
erros+="Informe a Porta;"
endif
if empty(alltrim(cTxt1)+alltrim(cTxt2))
erros+="Informe um Texto para o QrCode;"
endif
if !empty(erros)
alert("Corrija estas informacoes!;"+erros,NIL,"N/W*,W+/B")
LOOP
endif
//--AQUI FAZ O ENVIO DO TEXTO PARA IMPRESSORA
if len(alltrim(cPorta))<=4
pos = ASCAN(aPortas, {|e| e=alltrim(cPorta)})
if pos=0
alert("Corrija estas informacoes!;Porta INVALIDA escolha uma das opcoes da lista;ou coloque um mapeamento por exemplo;\\NOMEPC\NOMEIMPRESSORA ",NIL,"N/W*,W+/B")
LOOP
endif
endif
cValor=""
/*
for i=1 to len(aFab)
if cFab=aFab[i][1]
cValor=aFab[i][2]
endif
next
*/
cValor = IniObtemDados(aRetorno,"valor","["+alltrim(cFab)+"]")
if empty(cValor)
alert("Corrija estas informacoes!;Sem CHRs definidos para gerar o QRCODE.;Tente recarregar os fabricantes;para ver se resolve.;USE [PGDN]=Recarregar",NIL,"N/W*,W+/B")
LOOP
endif
cConteudoQRCode= alltrim(cTxt1)+alltrim(cTxt2)
nLen=len(cConteudoQRCode)+3
//pH := iif( nLen > 255, nLen / 256 , nLen ) //iTam2
//pL := iif( nLen > 255, MOD( nLen, 256 ), 0 ) //iTam1
pH := iif( nLen > 255, nLen / 255 , nLen ) //iTam2
pL := iif( nLen > 255, MOD( nLen, 255 ), 0 ) //iTam1
cValor=strtran(cValor,"MEUTEXTO","'"+cConteudoQRCode+"'")
cValor=strtran(cValor,"[ph]",alltrim(str(pH)) )
cValor=strtran(cValor,"[pl]",alltrim(str(pL)) )
@14,04 say substr(cValor,001,070)
@15,04 say substr(cValor,071,070)
@16,04 say substr(cValor,141,070)
@17,04 say substr(cValor,211,070)
@18,04 say substr(cValor,281,070)
@19,04 say substr(cValor,351,070)
bloco:={ |e| break(e)}
blocoantes:=ErrorBlock( bloco )
erroaqui=.f.
BEGIN SEQUENCE
setpos(26,80)
if !empty(cValor)
dispout(&cValor)
endif
RECOVER
erroaqui=.t.
END SEQUENCE
ErrorBlock(blocoantes)
if erroaqui=.t.
alert("String do QrCode nao aceita! Ha algo errado.",NIL,"N/W*,W+/B")
LOOP
endif
bloco:={ |e| break(e)}
blocoantes:=ErrorBlock( bloco )
erroaqui=.f.
BEGIN SEQUENCE
set printer to &(alltrim(cPorta)+":")
RECOVER
erroaqui=.t.
END SEQUENCE
ErrorBlock(blocoantes)
if erroaqui=.t.
alert("Porta nao e' valida! Verifique-a.",NIL,"N/W*,W+/B")
LOOP
endif
set devi to print
set cons off
set printer on
? "IMPRIMINDO QR CODE PELO FABRICANTE "
? cFab
? ""
? ""
? &cValor
? ""
? ""
? ""
? ""
? ""
? ""
? ""
? ""
? ""
? ""
? chr(27)+chr(105)
? chr(27)+chr(109)
set printer off
set cons off
set devi to screen
set printer to
@22,00 say padc("String gerada e enviada para a porta! Tecle algo para nova operacao!",80) colo "b/w*"
inkey(0)
@16,00 clea to 22,80
ENDDO
SetBlink(.F.)
QUIT
Function indFab(l,c,cFab)
LOCAL tela1:=savescreen(00,00,24,79), pos:=0, cor:=setcolor(),aFab1:={},i:=0,retorno:=.t.
if lastkey()!=24
return .t.
endif
for i=1 to len(aFab)
//aadd(aFab1,aFab[i][1])
aadd(aFab1,aFab[i])
next
set colo to b+/n,n/w*
@l,c-1 clea to l+15,c+len(cFab)+1
@l,c-1 to l+15,c+len(cFab)+1
pos=ACHOICE(l+1,c,l+14,c+len(cFab),aFab1)
if pos>0
cFab=padr(aFab1[pos],30)
else
retorno=.f.
endif
restscreen(00,00,24,79,tela1)
setcolor(cor)
return retorno
Function indPorta(l,c,cPorta)
LOCAL tela1:=savescreen(00,00,24,79), pos:=0, cor:=setcolor(),i:=0,retorno:=.t.
if lastkey()!=24
return .t.
endif
set colo to b+/n,n/w*
@l,c-1 clea to l+11,c+30+1
@l,c-1 to l+11,c+30+1
pos=ACHOICE(l+1,c,l+10,c+30,aPortas)
if pos>0
cPorta=padr(aPortas[pos],len(cPorta))
else
retorno:=.f.
endif
setcolor(cor)
restscreen(00,00,24,79,tela1)
return retorno
/* TESTE DE LEITURA OBTENDO OS CODIGOS DO ARQUIVO INI*/
/*
set colo to w+/b
cls
@01,00 SAY padc("QRCODE - TESTE PARA IMPRESSORAS TERMICAS 48 COLUNAS",80) colo "gr+/b"
arq="C:\NOVADE32\QRCHR.TXT"
ctime1=time()
aRetorno:=iniToarray(arq,350)
cResultado:=IniObtemDados(aRetorno,"valor","[BEMATECH2]")
? cResultado
ctime2=time()
? ctime1,ctime2
ctime1=time()
aRetorno = HB_ReadIni( arq )
? aRetorno["BEMATECH2"]["valor"]
ctime2=time()
? ctime1,ctime2
wait"veja o resultado"
quit
*/
//###################### FUNCOES DE MANIPULACAO DE ARQUIVO INI ##################
******************************************************************************
function IniToArray(cfile,LARGURA)
* carrega o arquivo e retorna um array com preenchido com as linhas do arquivo
* largura criada para uso no retorno das funcoes do S@T SAT
* Autor: Andril NSI SISTEMAS
******************************************************************************
local ar_tmp:={}
if empty(LARGURA)
LARGURA=80
endif
string=memoread(cfile)
linhas=mlcount(string,LARGURA) //,,.F.)
//memoedit(string,,,,,,,LARGURA)
for i = 1 to linhas
if !empty(memoline(string,LARGURA,i))
*--140616 tive que colocar o parametro .f. no 4o parametro de memoline para
*-- que a linha continua nao fosse quebrada no espaco e sim so quando
*-- o final de linha for encontrado. Tava retornando linha quebrada
*-- nao retornando os elementos corretos da linha, ex:
*--CORRETA Resultado=599712|06000|0000|Emitido com sucesso + conte?do notas|||PENGZT48aW5mQ0ZlIElkPSJDRmUzNTE2MDYxMTExMTExMTExMTExMTU5MTIzNDU2Nzg5MDAwMTM2
*--TAVA VINDO ASSIM Resultado=599712|06000|0000|Emitido com sucesso + conte?do
*-- notas|||PENGZT48aW5mQ0ZlIElkPSJDRmUzNTE2MDYxMTExMTExMTExMTExMTU5MTIzNDU2Nzg5MDAwMTM2
*--POR QUE ESSE RESTO DE STRING NAO TINHA NENHUM ESPACO QUEBRANDO A LINHA NO ESPACO APOS conte?do que
*--estava errado
//aadd(ar_tmp,memoline(string,LARGURA,i))
aadd(ar_tmp,memoline(string,LARGURA,i,,.f.))
*--
endif
next
if len(ar_tmp)=0
aadd(ar_tmp," ")
endif
return ar_tmp
******************************************************************************
function IniObtemDados(arrayini,variavel,cChave)
* arrayini -> array carregado com as linhas do ini, obtido pela funcao IniToArray
* variavel -> string correspondente ao parametro a ser buscado no INI
* cChave -> string que representa a chave dentro do INI [ECF]
* Por compatibilidade, se a chave nao for informada faz a busca apenas
* pelo conteudo dado em variavel.
*
* return caso tenha encontrado a variavel no array, retorna o valor
* ou "" caso nao tenha encontrado
*
* ARQ.INI [ECF]
* modelo=Todos
*
* USO a=IniObtemDados(meuarray,"modelo")
* ? a //Todos
*
* Autor: Andril NSI SISTEMAS
******************************************************************************
local posicao:=ascan(arrayini,{|x| alltrim(upper(x))=alltrim(upper(variavel))}),retorno:=""
totele=len(arrayini)
chavecerta=.f.
set exact on
if !empty(cChave)
for i = 1 to totele
*@24,00 say arrayini[i]
*@23,00 say chavecerta
if left(arrayini[i],1)="[".and.upper(cChave)==upper(alltrim(arrayini[i]))
chavecerta=.t.
elseif left(arrayini[i],1)="[".and.cChave!=alltrim(arrayini[i])
chavecerta=.f.
endif
if chavecerta=.t.
//if alltrim(upper(variavel))$upper(arrayini[i])
if alltrim(upper(variavel))==upper(substr(arrayini[i],0,at("=",arrayini[i])-1))
retorno:=alltrim(substr(arrayini[i],at("=",arrayini[i])+1))
exit
endif
endif
*inkey(.5)
next
else //se nao for informado a chave para obter a varivel especifica
if posicao>0
retorno:=alltrim(substr(arrayini[posicao],at("=",arrayini[posicao])+1))
endif
endif
set exact off
return retorno
******************************************************************************
function IniMudaDados(arrayini,variavel,conteudo,cChave)
* arrayini -> array carregado com as linhas do ini, obtido pela funcao IniToArray
* variavel -> string correspondente ao parametro a ser buscado no INI
* conteudo -> string contendo o novo valor para atualizar a posicao do array
* cChave -> string que representa a chave dentro do INI [ECF]
* Por compatibilidade, se a chave nao for informada faz a busca apenas
* pelo conteudo dado em variavel.
* return caso tenha conseguido atualizar a posicao do array correspondente
* a variavel informada, returna .t. ou .f. se nao tiver exito
*
* ARQ.INI [ECF]
* modelo=Todos
*
* USO if IniMudaDados(meuarray,"modelo","Todos os modelos")
* wait"Valor da variavel repassado ao array"
* else
* wait"variavel do array nao atualizada"
* endif
* Autor: Andril NSI SISTEMAS
******************************************************************************
local posicao:=ascan(arrayini,{ |x| alltrim(upper(x))=alltrim(upper(variavel))}),retorno:=.f.
totele=len(arrayini)
chavecerta=.f.
set exact on
if !empty(cChave)
for i = 1 to totele
*@24,00 say arrayini[i]
*@23,00 say chavecerta
if left(arrayini[i],1)="[".and.upper(cChave)==upper(alltrim(arrayini[i]))
chavecerta=.t.
elseif left(arrayini[i],1)="[".and.cChave!=alltrim(arrayini[i])
chavecerta=.f.
endif
if chavecerta=.t.
//if alltrim(upper(variavel))$upper(arrayini[i])
if alltrim(upper(variavel))==upper(substr(arrayini[i],0,at("=",arrayini[i])-1))
arrayini[i]:=variavel+"="+conteudo
exit
endif
endif
*inkey(.5)
next
else
if posicao>0
arrayini[posicao]:=variavel+"="+conteudo
retorno:=.t.
endif
endif
set exact off
return retorno
******************************************************************************
function ArraytoIni(arrayini,arquivo,silencio)
* arrayini -> array carregado com as linhas do ini, obtido pela funcao IniToArray
* arquivo -> string, contendo o caminho e nome do arquivo que recebera os dados
* do array
* silencio -> "SIM" nao exibe a janela de confirmacao de salvamento
* Autor: Andril NSI SISTEMAS
******************************************************************************
*local arqtmp:="TMPINI"+padl(maq,2,"0")+".TMP",string:=""
local arqtmp:=rtrim(caminho1)+"\TMPINI"+padl(random()%99 +1,2,"0")+".TMP",string:=""
*--se ja exitir o arquivo muda o nome ate obter um que nao existe, antes usava
*--a variavel maq, mais como no makemix é MAQUINA e no CSO é maq ai dava erro
do while file(arqtmp)
inkey(0.2)
arqtmp:=rtrim(caminho1)+"\TMPINI"+padl(random()%99 +1,2,"0")+".TMP"
enddo
for i = 1 to len(arrayini)
string=string+arrayini[i]+CHR(13)+CHR(10)
next
if !empty(string)
/*
if memowrit(arqtmp,string)
ferase(arquivo)
COPY FILE (arqtmp) TO (arquivo) //frename(arqtmp,arquivo)
if silencio!="SIM"
JanMultLinha("Os dados foram salvos com sucesso!"+CHR(13)+CHR(10)+"Tecle algo.",6,,,"SALVANDO DADOS")
endif
endif
*/
hd1=FCREATE(arquivo)
if hd1>0
FWRITE(hd1,string)
FCLOSE(hd1)
if silencio!="SIM"
//JanMultLinha({"Informacoes salvas com sucesso!";
// },6,"","","AVISO")
endif
return .t.
else
//JanMultLinha({"Erro : "+SE(Ferror())+" ao gerar o arquivo",;
// SE(arquivo)},6,"","","ERRO")
return .f.
endif
endif
Em anexo coloco o arquivo qrchr.php e qrchr.txt onde há os comandos citados neste post. Salve-os na mesma pasta e execute