FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour COMO IMPRIMO UN CODIGO DE BARRA EN UN DIALOGO
Posts: 225
Joined: Tue Feb 28, 2006 04:25 PM
COMO IMPRIMO UN CODIGO DE BARRA EN UN DIALOGO
Posted: Fri Jun 05, 2009 09: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
Posts: 162
Joined: Tue Feb 03, 2009 10:08 PM
Re: COMO IMPRIMO UN CODIGO DE BARRA EN UN DIALOGO
Posted: 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 2501, BCC++_x64 7_70 , Harbour 3.20, LopeEdit 5.8
jepsys@hotmail.com, jepsys@gmail.com

Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: COMO IMPRIMO UN CODIGO DE BARRA EN UN DIALOGO
Posted: Tue Jun 09, 2009 03: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.

Continue the discussion