COMO IMPRIMO UN CODIGO DE BARRA EN UN DIALOGO

COMO IMPRIMO UN CODIGO DE BARRA EN UN DIALOGO

Postby Vladimir Zorrilla » Fri Jun 05, 2009 9:30 pm

Amigos como puedo imprimir un codigo de barra en una caja de dialogo

Esta funcion _code128 me devuelve una cadena de 1 y 0 que representa las barras

Para imprimir las barras uso go2code
quien recibe esa cadena y la imprime

Pero eso lo hace para la impresora ,la clase de cayetano no tiene de como hacerlo
con una caja de dialogo .
Para dibujar las barras usa el metodo fillrect de la clase printer
Yo la adapto con un get usando la fucion fillrect pero no dibuja las barras
en el get que podra ser :


go2code(_code128(oAlum:barcode),0,0,oGet,,,,)

Aqui ose dejo el codigo de go2code para ver en donde puede esta el error

/// oprint es oget ojo es solo una variable q ahora es un get
function go2code( cBarra, nx,ny,oPrint,lHoRz, nColor, nWidth, nLen)

local n, oBr
if empty(nColor)
nColor := CLR_BLACK
end
default lHorz := .t.

default nWidth := 25//0.025 // 1/3 M/mm

default nLen :=15// 1.5 // Cmm.

define brush oBr color nColor
// Width of Bar
if !lHorz
nWidth :=round ( nWidth ,0 ) //* 10 ,0 )//* oPrint:nVertRes() / oPrint:nVertSize() ,0 )
else
nWidth :=round ( nWidth ,0 ) //* 10 ,0 )//* oPrint:nHorzRes() / oPrint:nHorzSize(), 0 )
end
// Len of bar
if lHorz
nLen :=round ( nLen ,0 ) //* 10 ,0 )//* oPrint:nVertRes() / oPrint:nVertSize() ,0 )
else
nLen :=round ( nLen ,0 ) //* 10 ,0 )//* oPrint:nHorzRes() / oPrint:nHorzSize(), 0 )
end

for n:=1 to len(cBarra)
if substr(cBarra,n,1) ='1'
//FillRect( ::hDC, GetClientRect( ::hWnd ), ::oBrush:hBrush )
? nx,ny,nx+nLen,(ny+=nWidth)
if lHorz
FillRect( oPrint:hDC, {nx,ny,nx+nLen,(ny+=nWidth)}, oBr )
//oPrint:fillRect({nx,ny,nx+nLen,(ny+=nWidth)},oBr)
else
FillRect( oPrint:hDC,{nx,ny,(nx+=nWidth),ny+nLen} , oBr )
// oPrint:fillRect({nx,ny,(nx+=nWidth),ny+nLen},oBr)
end
else
if lHorz
ny+=nWidth
else
nx += nWidth
end
end
next

oBr:end()
return nil



Y el codigo de _code128 es este

static aCode :={"212222",;
"222122",;
"222221",;
"121223",;
"121322",;
"131222",;
"122213",;
"122312",;
"132212",;
"221213",;
"221312",;
"231212",;
"112232",;
"122132",;
"122231",;
"113222",;
"123122",;
"123221",;
"223211",;
"221132",;
"221231",;
"213212",;
"223112",;
"312131",;
"311222",;
"321122",;
"321221",;
"312212",;
"322112",;
"322211",;
"212123",;
"212321",;
"232121",;
"111323",;
"131123",;
"131321",;
"112313",;
"132113",;
"132311",;
"211313",;
"231113",;
"231311",;
"112133",;
"112331",;
"132131",;
"113123",;
"113321",;
"133121",;
"313121",;
"211331",;
"231131",;
"213113",;
"213311",;
"213131",;
"311123",;
"311321",;
"331121",;
"312113",;
"312311",;
"332111",;
"314111",;
"221411",;
"431111",;
"111224",;
"111422",;
"121124",;
"121421",;
"141122",;
"141221",;
"112214",;
"112412",;
"122114",;
"122411",;
"142112",;
"142211",;
"241211",;
"221114",;
"213111",;
"241112",;
"134111",;
"111242",;
"121142",;
"121241",;
"114212",;
"124112",;
"124211",;
"411212",;
"421112",;
"421211",;
"212141",;
"214121",;
"412121",;
"111143",;
"111341",;
"131141",;
"114113",;
"114311",;
"411113",;
"411311",;
"113141",;
"114131",;
"311141",;
"411131",;
"211412",;
"211214",;
"211232",;
"2331112"}


function _code128(cCode,cMode)

local nSum:=0, cBarra, cCar
local cTemp, n, nCAr, nCount:=0
local lCodeC := .f. ,lCodeA:= .f.


// control de errores
if valtype(cCode) !='C'
alert('Barcode c128 required a Character value. ')
return nil
end
if !empty(cMode)
if valtype(cMode)='C' .and. Upper(cMode)$'ABC'
cMode := Upper(cMode)
else
alert('Code 128 Modes are A,B o C. Character values.')
end
end
if empty(cMode) // modo variable
// an lisis de tipo de c¢digo...
if str(val(cCode),len(cCode))=cCode // s¢lo n£meros
lCodeC := .t.
cTemp:=aCode[106]
nSum := 105
else
for n:=1 to len(cCode)
nCount+=if(substr(cCode,n,1)>31,1,0) // no cars. de control
end
if nCount < len(cCode) /2
lCodeA := .t.
cTemp := aCode[104]
nSum := 103
else
cTemp := aCode[105]
nSum := 104
end
end
else
if cMode =='C'
lCodeC := .t.
cTemp:=aCode[106]
nSum := 105
elseif cMode =='A'
lCodeA := .t.
cTemp := aCode[104]
nSum := 103
else
cTemp := aCode[105]
nSum := 104
end
end

nCount := 0 // caracter registrado
for n:= 1 to len(cCode)
nCount ++
cCar := substr(cCode,n,1)
if lCodeC
if len(cCode)=n // ultimo caracter
CTemp += aCode[101] // SHIFT Code B
nCar := asc(cCar)-31
else
nCar := Val(substr(cCode,n,2))+1
n++
end
elseif lCodeA
if cCar> '_' // Shift Code B
cTemp += aCode[101]
nCar := asc(cCar)-31
elseif cCar <= ' '
nCar := asc(cCar)+64
else
nCar := asc(cCar)-31
endif
else // code B standard
if cCar <= ' ' // shift code A
cTemp += aCode[102]
nCar := asc(cCar)+64
else
nCar := asc(cCar)-31
end
endif
nSum += (nCar-1)*nCount
cTemp := cTemp +aCode[nCar]
next
nSum := nSum%103 +1
cTemp := cTemp + aCode[ nSum ] +aCode[107]
cBarra := ''
for n:=1 to len(cTemp) step 2
cBarra+=replicate('1',val(substr(cTemp,n,1)))
cBarra+=replicate('0',val(substr(cTemp,n+1,1)))
next
return cBarra
ME INTERESA FW Y XHB POR SER OPEN SOURCE
Vladimir Zorrilla
 
Posts: 225
Joined: Tue Feb 28, 2006 4:25 pm
Location: PERU

Re: COMO IMPRIMO UN CODIGO DE BARRA EN UN DIALOGO

Postby J. Ernesto » Mon Jun 08, 2009 10:45 pm

Vladimir... estoy utlizando el codigo del Cayetano con algunos ajustes para imprimir stickers con Códigos de Barras, y tambien necesite que esas barras se vieran en pantalla, para ello hice unos cambios y en ves de enviar a oPrn:Impresora lo hice al dialogo y me quedo algo asi:

* *************************************** ******************** ************************************************** *
Function DibujarCodebar ( cdBarras, nx, ny, oDlg, lHorz, nColor, nAncho, nAlto ) && Dibuja un código de Barras en la Pantalla
Local oBrush, K := 0

IF EMPTY ( nColor )
nColor := CLR_BLACK && Color negro para rellenar los retangulos
ENDIF

Default lHorz := .T.
Default nAncho := 02.50 && Pixeles de Ancho
Default nAlto := 80.00 && Pixeles de Alto

Define BRUSH oBrush COLOR nColor && Brocha de relleno para cada Barra

FOR K := 1 TO LEN ( cdBarras ) && Dibujar retangulos rellenos del color seleccionado
IF SUBSTR ( cdBarras, K, 1 ) = '1' && Es una Barra Negra
IF lHorz
FillRect ( oDlg:GetDC (), { nx, ny, nx + nAlto , ( ny += nAncho ) }, oBrush:hBrush ) && las coordenadas ya estan en Pixeles
ELSE
FillRect ( oDlg:GetDC (), { nx, ny, ( nx += nAncho ), ny + nAlto } , oBrush:hBrush ) && para Dibujar el código en pantalla
ENDIF
ELSEIF lHorz && es un 0, o un espacio en Blanco := Barras Blancas
ny += nAncho
ELSE
nx += nAncho
ENDIF
NEXT K

oBrush:end()
Return nil
* **************************************** ******************** ************************************************* *

* ************************************** *** Begin BarLen13 *** ************************************************ *
* Imprimir el texto Numérico que forma el Código del Producto
Function Dibujar13BarLen ( CodePEP, nx, ny, oDlg, lHorz, nColor, nAncho, nAlto, cFont )
Local oFont

Default nAncho := 02.50
Default nAlto := 80.00
Default cFont := 'arial'
Default nColor := CLR_BLACK

Define FONT oFont NAME cFont SIZE nAncho * 5.60, nAlto * 0.25

@ nx + nAlto, ny - ( nAncho * 08.00 ) SAY LEFT ( CodePEP, 1 ) FONT oFont SIZE 020, 20 OF oDlg PIXEL COLOR nColor && El Dígito que va a la Izquierda
@ nx + nAlto, ny + ( nAncho * 03.00 ) SAY SUBSTR ( CodePEP, 2, 6 ) FONT oFont SIZE 100, 20 OF oDlg PIXEL COLOR nColor && Los siguientes 6 Dígitos de la Izquierda
@ nx + nAlto, ny + ( nAncho * 50.00 ) SAY SUBSTR ( CodePEP, 8, 6 ) FONT oFont SIZE 100, 20 OF oDlg PIXEL COLOR nColor && Los siguientes 6 Digitos de la Derecha

oFont:End()
Return nil
* ************************************** **** End BarLen13 **** ************************************************ *

* ******************************************* Begin BarLen08 *************************************************** *
Function Dibujar08BarLen ( CodePEP, nDigs, nx, ny, oDlg, nColor, lHorz, nAncho, nAlto, cFont )
Local oFont

Default nAncho := 02.00
Default nAlto := 80.00
Default cFont := 'arial'
Default nColor := CLR_BLACK
Default nDigs := 11

sparte1 := LEFT ( CodePEP, nDigs / 2 ) && los 6 primeros dígitos
sparte2 := RIGHT ( CodePEP, nDigs / 2 ) && los 6 últimos dígitos

Define FONT oFont NAME cFont SIZE nAncho * 5.60, nAlto * 0.25

@ nx + nAlto, ny + ( nAncho * 03.00 ) SAY sparte1 FONT oFont SIZE 100, 20 OF oDlg PIXEL COLOR nColor
@ nx + nAlto, ny + ( nAncho * ( INT ( nDigs ) / 2 * 7 + 8 ) ) SAY sparte2 FONT oFont SIZE 100, 20 OF oDlg PIXEL COLOR nColor

oFont:End()
Return nil
* ******************************************** End BarLen08 **************************************************** *

si tienes alguna duda por favor al mail..... jepsys@gmail.com

Salu2
J. Ernesto Pinto Q.
Fwh_x64 2407 + BCC++_x64 7_70__6_72 + Harbour 3.20 + LopeEdit 5.8 + UEstudio 26.0
jepsys@hotmail.com, jepsys@gmail.com, jepsys@yahoo.com
User avatar
J. Ernesto
 
Posts: 161
Joined: Tue Feb 03, 2009 10:08 pm
Location: Bogotá D.C. Colombia

Re: COMO IMPRIMO UN CODIGO DE BARRA EN UN DIALOGO

Postby cmsoft » Tue Jun 09, 2009 3:01 am

Hola Vladimir:
Otra forma de hacerlo, tanto en un dialogo como en la impresora, es utilizando un font de codigos de barra. Dependiendo del font, tenes la codificacion que utiliza para representar las barras, pero es mucho mas sencillo.
User avatar
cmsoft
 
Posts: 1291
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 51 guests