Imprimir QRCODE nativo da impressora com ESC/POS

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

Moderador: Moderadores

Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Imprimir QRCODE nativo da impressora com ESC/POS

Mensagem por ANDRIL »

Preciso imprimir um QrCode no cupom de venda não fiscal (praticamente no meio do cupom) via comandos ESC/POS, peguei alguns comandos pela internet nos foruns e manuais, mas não funcionam adequadamente. Uns chegam até imprimir porem o TEXTO que tem que sair nele fica com alguns caracteres que não deveria.

[BEMATECH4200]
//SELECIONAR MODELO: GS ( k pL pH cn fn n1 n2
CHR(29)+"(k"+CHR(4)+CHR(0)+"1A2"+CHR(0)+

//SELECIONAR TAMANHO DO MODULO: GS ( k pL pH cn fn n
CHR(29)+"(k"+CHR(3)+CHR(0)+"1C"+CHR(4)+

//SELECIONAR NIVEL DE CORRECAO DE ERRO: GS ( k pL pH cn fn n
CHR(29)+"(k"+CHR(3)+CHR(0)+"1E1"+

//ARMAZENAR TEXTO EM MEMORIA: GS ( k pL pH cn fn m d1...dk
CHR(29)+"(k"+CHR(pl)+CHR(ph)+CHR(49)+CHR(80)+CHR(48)+MEUTEXTO+

//IMPRIMIR QRCODE: GS ( k pL pH cn fn m
CHR(29)+"(k"+CHR(3)+CHR(0)+"1Q0"
fonte: https://www.projetoacbr.com.br/forum/to ... ch-4200th/
Este código acima imprime mas com dados dos chrs no texto do qrcode, deve ter algo de errado

[MP4200]
CHR(29)+CHR(107)+CHR(81)+CHR(1)+CHR(6)+CHR(8)+CHR(1)+chr([pl])+chr([ph])+MEUTEXTO+CHR(27)+CHR(64)
ESTE CHR(8) E' O TAM DO QRCODE onde 8 é o tamanho desejado
fonte: https://www.youtube.com/watch?v=3ZRrFCVS7os suporte próprio da BEMATECH
Não funcionou

[MP2500]
CHR(29)+CHR(40)+CHR(107)+CHR(3)+CHR(0)+CHR(49)+CHR(67)+CHR(9)+
CHR(29)+CHR(40)+CHR(107)+CHR(3)+CHR(0)+CHR(49)+CHR(69)+CHR(48)+
CHR(29)+CHR(40)+CHR(107)+CHR(147)+CHR(0)+CHR(49)+CHR(80)+CHR(48)+MEUTEXTO+
CHR(29)+CHR(40)+CHR(107)+CHR(3)+CHR(0)+CHR(49)+CHR(81)+CHR(48)+CHR(27)+CHR(64)
fonte: https://www.youtube.com/watch?v=3ZRrFCVS7os suporte próprio da BEMATECH
Não funcionou

[SWEDA SI300]
//SELECIONAR MODELO: GS ( k pL pH cn fn n1 n2
CHR(29)+"(k"+CHR(4)+CHR(0)+"1A2"+CHR(0)+

//SELECIONAR TAMANHO DO MODULO: GS ( k pL pH cn fn n
CHR(29)+"(k"+CHR(3)+CHR(0)+"1C"+CHR(3)+

//SELECIONAR NIVEL DE CORRECAO DE ERRO: GS ( k pL pH cn fn n
CHR(29)+"(k"+CHR(3)+CHR(0)+"1E0"+

//ARMAZENAR TEXTO EM MEMORIA: GS ( k pL pH cn fn m d1...dk
CHR(29)+"(k"+CHR(pl)+CHR(ph)+CHR(49)+CHR(80)+CHR(48)+MEUTEXTO+

//IMPRIMIR QRCODE: GS ( k pL pH cn fn m
CHR(29)+"(k"+CHR(3)+CHR(0)+"1Q0"
fonte: https://sweda.com.br/downloads/523_manu ... pdf?x40281
Não funcionou

Não sei o que estou fazendo de errado mas não vai de jeito algum.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Imprimir QRCODE nativo da impressora com ESC/POS

Mensagem por rochinha »

Amiguinhos,

ANDRIL, mostre o trecho de código que gera as linhas que você apresenta, pois não dá pra saber que o que você colocou é o que está querendo imprimir ou se literalmente é o conteúdo que está indo para a impressora.

Sem ver o código não dá pra ter a noção de como estão indo os comandos, se você está imprimindo direto, fazendo eval(), etc.
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.
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Imprimir QRCODE nativo da impressora com ESC/POS

Mensagem por ANDRIL »

Rochinha, cheguei a criar um programa de teste. Este programa puxa os CHRs de um arquivo QRCHR.TXT que na verdade é um INI.
Feito em Harbour 3.2

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
hbmk2 qrchr hbct.hbc -gui -gtwvg hbwin.hbc
Anexos
qrchr.prg
(14.86 KiB) Baixado 107 vezes
qrchr.txt
(2.6 KiB) Baixado 158 vezes
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Imprimir QRCODE nativo da impressora com ESC/POS

Mensagem por rochinha »

Amiguinhos,

ANDRIL
126| /*
127| for i=1 to len(aFab)
128| if cFab=aFab[1]
129| cValor=aFab[2]
130| endif
131| next
132| */
133| cValor = IniObtemDados(aRetorno,"valor","["+alltrim(cFab)+"]")


Na linha 133 você pega o conteúdo de valor e tudo que vem desta variável é tipificado como texto de tal forma que CHR(9) não retorna O caracter especial mas sim o literal de 6 letras. Quer tal você já avaliar o conteúdo quando trazê-lo do TXT/INI?

cValor = &( IniObtemDados(aRetorno,"valor","["+alltrim(cFab)+"]") )


Ao mandar um print direto da variável cValor os comandos são executados e entendidos na impressora.

Exemplo do seu array aFab(que você não está usando) ao invés de salvar literalmente:

aadd( aFab, { "EPSON", "CHR(29)+'(k'+CHR(4)...blablabla...HR(0)+'1Q0'" } )

Você salva assim:

aadd( aFab, { "EPSON", CHR(29)+'(k'+CHR(4)...blablabla...HR(0)+'1Q0' } )

O conteúdo ficará irreconhecível mas executável. Desta forma a emulação de teclagem acontecerá.

Não compilei seu exemplo porque meu ambiente não esta bem configurado para Harbour Puro
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.
Responder