Enviado: 27 Jul 2007 19:09
Compensaria se não houvessem tantas marcas de relógios. Daria pra fazer algo até melhor e sairiam muitas vendas. Mas não é o caso.
Em homenagem a Paulo Cesar Toledo
https://pctoledo.org/
Seria +/- isso. Mas o código extra deveria vir primeiro, já que ao detectá-lo, a função especial saberia o que esperar. A função em si é simples. Se chamaria, por exemplo, MyInKey(). Nela você teria um while, por exemplo. Dentro deste, uma chamada à InKey() original. Lido o caractere, se não for o caractere especial, você simplesmente sai do while e retorna com o código da tecla que veio. Sendo o caractere especial, você saberia que estão pra chegar outros 13 caracteres do código do funcionário (EAN13). Uma vez que tenham vindo todos esses caracteres, de posse do número, você chama a função que faz o registro, lhe passando esse código. Assim que ela retornar, o while de sua MyInKey() continua.000021ACK
Código: Selecionar todos
STATIc nPortaSerial := 0
#command DEFAULT <var> TO <def> [, <varn> TO <defn>] => ;
<var> := if(<var> = nil,<def>,<var>) [; <varn> := if(<varn> = nil,<defn>,<varn>)]
function ExTeclado()
local Test := Space(20), UltCartaoLido := "", GetList := {}
SetKey( 255, {|| UltCartaoLido := LerCartao() } )
KEYB chr(255) //colocado para testar chamada
WHIL !LastKey() = 27
@ 10, 10 say "Esperando passar cartao" Get Test
READ
ENDDO
RETU .T.
FUNCTION LerCartao()
LOCAL sStrCartao := ""
WHIL NextKey() > 0
sStrCartao += Inkey()
ENDDO
Alert( "Passou Cartao: " + sStrCartao ) //retirar este Alert apos teste
RETU sStrCartaoCódigo: Selecionar todos
Function ExSerial( nPorta, nIrq, nIo, nBufferIn, nBufferOut, lTrapMode, nBaud, sPar, nBit, nStop )
LOCAL UltCartaoLido := "", nWait := 500
//nWait - Muito Alto demora a ler CodBarra, Muito Baixo (trava ou deixa lenta) a maquina
DEFA nPorta TO 1
DEFA nIrq TO 4
DEFA nIo TO "03F8"
DEFA nBufferIn TO 1000
DEFA nBufferOut TO 1000
DEFA lTrapMode TO .T.
DEFA nBaud TO 9600
DEFA sPar TO "N"
DEFA nBit TO 8
DEFA nStop TO 1
IF !AbreCom( nPorta, nIrq, nIo, nBufferIn, nBufferOut, lTrapMode, nBaud, sPar, nBit, nStop )
nPortaSerial := 0
RETU .F.
ENDIF
nPortaSerial := nPorta
WHILE .T.
UltCartaoLido := LeSerial()
IF !Empty(UltCartaoLido)
//salva em DBF ou TXT
ENDIF
IF LastKey() = 27
IF Alert("Sair", {"Nao", "Sim"} ) = 2 //procure trocar esta funcao por uma que se passar nSegundos sem pressionar qualquer tecla volta a fazer o monitoramento
RETU .T.
ENDIF
ENDIF
millisec( nWait )
ENDDO
RETU .T.
Function LeSerial()
LOCAL CodBarra := "", TimeOut := 0, Cod := "", Cod1 := ""
IF !Com_Count( nPortaSerial ) > 0
RETU ""
ENDIF
TimeOut := Seconds() + 2
WHILE .T.
IF Com_Count( nPortaSerial ) > 0
Cod := com_read( nPortaSerial, 1)
Cod1 := Asc(Cod)
IF Cod1 = 13 //ENTER ENCONTRADO FIM DE CODBARRA, configure o CCD para sinalizar FIM com Chr(13)
Com_Flush( nPortaSerial ) //limpa porta caso tenha algum lixo
EXIT
ENDIF
CodBarra += Cod
ELSEIF Seconds() > TimeOut
//TIMEOUT na porta COM" + cStr(CCDPortaCom), 79)
Com_Flush( nPortaSerial )
CodBarra := ""
EXIT
ENDIF
MILLISEC(5)
ENDDO
RETU CodBarra
//Generica pode ser usada independente, abre COM com tratamento de erro
function AbreCom( nPorta, nIrq, nIo, nBufferIn, nBufferOut, lTrapMode, nBaud, sPar, nBit, nStop )
DEFA nPorta TO 1
DEFA nIrq TO 4
DEFA nIo TO "03F8"
DEFA nBufferIn TO 1000
DEFA nBufferOut TO 1000
DEFA lTrapMode TO .T.
DEFA nBaud TO 9600
DEFA sPar TO "N"
DEFA nBit TO 8
DEFA nStop TO 1
//definir antes de abrir a porta
IF !com_setirq( nPorta, nIrq ) //util para multserial como NETMOS que so funciona se definir IRQ/IO
ALERT( "NAO FOI POSSIVEL ALTERAR IRQ - " + LTrim(Str( nIrq )) + " - PORTA COM" + LTrim(Str( nPorta)) )
RETU .F.
ENDIF
//definir antes de abrir a porta
IF !com_setio( nPorta, nIo )
ALERT( "NAO FOI POSSIVEL ALTERAR ENDERECO I/O - " + LTrim(Str(nIo)) + " - PORTA COM" + LTrim(Str( nPorta) ))
RETU .F.
ENDIF
/*
nBufferIn=buffer de entrada - padrao=100 byte
nBufferOut=buffer de saida - padrao=quantidade sendo enviada
lTrapMode=Interompe tramissao em caso de erro
*/
IF !Com_Open( nPorta, nBufferIn, nBufferOut, lTrapMode )
ALERT( "NAO FOI POSSIVEL ABRIR A PORTA COM" + LTrim(Str( nPorta )) )
RETURN .F.
ENDIF
//controle por SOFT ou HARD de dados, de preferencia a SOFT
com_soft( nPorta, .T. )
//com_hard( nPorta, .T. )
/*
Inicializa porta com valores, que difere de acordo com periferico conectado
nPorta= 300, 600, 1200, 2400, 4800, 9600, 19200 - padrao=300
nBaud = (E)ven, (O)dd, (M)ark, (S)pace, (N)one - padao=N
nBit=8, 7 - padrao=8
nStop=1, 2 - padrao=1
*/
IF !com_init( nPorta, nBaud, sPar, nBit, nStop )
com_close( nPorta )
ALERT( "NAO FOI POSSIVEL INICIALIZAR A PORTA COM" + lTrim(Str( nPorta )) ;
+ "," + LTrim(Str(nBaud)) ;
+ "," + Upper(sPar) ;
+ "," + LTrim(Str(nBit)) ;
+ " " + LTrim(Str(nStop)))
RETURN .f.
ENDIF
COM_FLUSH( nPorta ) //limpa porta
RETURN .T.
Código: Selecionar todos
#INCLUDE "bgevents.ch"
Function ExBGEvent( nPorta, nIrq, nIo, nBufferIn, nBufferOut, lTrapMode, nBaud, sPar, nBit, nStop )
LOCAL UltCartaoLido := "", nWait := 500
//nWait - Muito Alto demora a ler CodBarra, Muito Baixo (trava ou deixa lenta) a maquina
DEFA nPorta TO 1
DEFA nIrq TO 4
DEFA nIo TO "03F8"
DEFA nBufferIn TO 1000
DEFA nBufferOut TO 1000
DEFA lTrapMode TO .T.
DEFA nBaud TO 9600
DEFA sPar TO "N"
DEFA nBit TO 8
DEFA nStop TO 1
IF !AbreCom( nPorta, nIrq, nIo, nBufferIn, nBufferOut, lTrapMode, nBaud, sPar, nBit, nStop )
nPortaSerial := 0
RETU .F.
ENDIF
nPortaSerial := nPorta
AtivaCCD( .f. )
RETU .T.
Function LeCCD()
LOCAL sCodBarra := ""
sCodBarra := LeSerial()
IF !Empty(sCodBarra)
//incluir aqui salvar CODBARRA
ENDIF
RETU .T.
FUNC AtivaEventoCCD()
STATIC lAtivado := .f.
IF lAtivado
RETU .t.
ENDIF
lAtivado := .t.
//nao retire, desativa monitoramento quanto esta debugando
IF IsDebug()
background events debug off
SetReEntrant(.F.)
ELSE
SetReEntrant(.T.)
ENDIF
BACKGROUND EVENTS AUTOACTIVATE
BACKGROUND EVENTS EXECUTE ALL
Define backgroundevent Action LeCCD() interval .5 name ccd
RETU .T.
Function AtivaCCD( lSet )
DEFA lSet TO .T.
AtivaEventoCCD()
IF lSet
BGE_Start()
ELSE
BGE_Stop()
ENDIF
RETU .T.