Massimo,  thanks for finding that.  After looking through this and finally a
page that kind of briefly explains CODE128, I will just write my own,
probably in C... or maybe Clipper.

http://www.barcodeisland.com/code128.phtml

I'll probably make it public, if anyone else wants it.. but likely I'm only
going to make it print CODE128B and no fancy switching between mode A, B,
and C...  maybe if I have more time, I will.

Thanks again

On Sun, Jan 31, 2010 at 3:11 AM, Massimo Belgrano <[email protected]>wrote:

> here a visual fox pro solution more compatible with harbour
> *-----------------------------------------------------------
> * Conversion VB --> VFP : Emile MAITREJEAN www.emsystems.be
> *-----------------------------------------------------------
> * Entrée : lcChaine
> *
> * Retour : * w_code128 qui, affichée avec la police CODE128.TTF, donne
> le code barre
> *          * une chaine vide si paramètre fourni incorrect
> code128 = ""
> IF LEN(lcChaine) > 0
>        * Vérifier si caractères valides
>        FOR lni = 1 TO LEN(lcChaine)
>                IF ASC(SUBSTR(lcChaine, lni, 1)) >= 32 AND
> ASC(SUBSTR(lcChaine, lni,
> 1)) <= 126
>                ELSE
>                        lni = 0
>                        EXIT
>                ENDIF
>        ENDFOR
>        * Calculer la chaine de code en optimisant l'usage des tables B et C
>        code128 = ""
>        tableB = .T.
>        IF lni > 0
>                lni = 1
> &&lni devient l'index sur la chaine
>                DO WHILE lni <= LEN(lcChaine)
>                        IF tableB
>                                * Voir si intéressant de passer en table C
>                                * Oui pour 4 chiffres au début ou à la fin,
> sinon pour 6 chiffres
>                                minlni = IIF(lni = 1 OR lni + 3 =
> LEN(lcChaine), 4, 6)
>                                *=============                          DO
> testnum
>                                *=============                          IF
> minlni < 0                   && Choix table C
>                                        IF lni = 1                      &&
> Débuter sur table C
>                                                code128 = CHR(210)
>                                        ELSE                            &&
> Commuter sur table C
>                                                code128 = code128+CHR(204)
>                                        ENDIF
>                                        tableB = .F.
>                                ELSE
>                                        IF lni = 1
>                                                code128 = CHR(209) &&
> Débuter sur table B
>                                        ENDIF
>                                ENDIF
>                        ENDIF
>                        IF NOT tableB Then
>                                 * On est sur la table C, essayer de traiter
> 2 chiffres
>                                 minlni = 2
>                                *=============                          DO
> testnum
>                                *=============                          IF
> minlni < 0 && OK pour 2 chiffres, les traiter
>                                        dummy = Val(SUBSTR(lcChaine, lni,
> 2))
>                                        dummy = IIF(dummy < 95, dummy + 32,
> dummy + 100)
>                                        code128 = code128+CHR(dummy)
>                                        lni = lni + 2
>                                ELSE
>                    && On n'a pas 2 chiffres, repasser en table B
>                                        code128 = code128+CHR(205)
>                                        tableB = .T.
>                                ENDIF
>                        ENDIF
>                        IF tableB
>                                * Traiter 1 caractère en table B
>                                code128 = code128+SUBSTR(lcChaine, lni, 1)
>                                lni = lni + 1
>                        ENDIF
>                ENDDO
>                * Calcul de la clé de contrôle
>                FOR lni = 1 TO LEN(code128)
>                        dummy = ASC(SUBSTR(code128, lni, 1))
>                        dummy = IIF(dummy < 127, dummy - 32, dummy - 100)
>                        IF lni = 1
>                                CheckSum = dummy
>                        ELSE
>                                CheckSum = MOD((CheckSum + (lni - 1) *
> dummy),103)
>                        ENDIF
>                ENDFOR
>                * Calcul du code ASCII de la clé
>                CheckSum = IIF(CheckSum < 95, CheckSum + 32, CheckSum + 100)
>                * Ajout de la clé et du STOP
>                code128 = code128+CHR(CheckSum)+CHR(211)
>        ENDIF
> ENDIF
> w_code128 = code128
> RETURN
> FUNCTION testnum
>        * si les minlni caractères à partir de lni sont numériques, alors
> minlni=0
>        minlni = minlni - 1
>        IF lni + minlni <= LEN(lcChaine)
>                DO WHILE minlni >= 0
>                        IF ASC(SUBSTR(lcChaine, lni + minlni, 1)) < 48 OR
> ASC(SUBSTR(lcChaine, lni + minlni, 1)) > 57
>                                EXIT
>                        ENDIF
>                        minlni = minlni - 1
>                ENDDO
>        ENDIF
>        ENDFUNC
>
>
> 2010/1/31 Massimo Belgrano <[email protected]>:
> > One way for printing barcode code 128 symbologies  is use font
> > here you can find a open source solution
> > http://sourceforge.net/projects/openbarcodes/
> > here a commercial solution http://www.barcodesoft.com/code128_font.aspx
> >
> > Folllow a untested sample
> >
> > oPrn := win_prn():New(GetDefaultPrinter())
> > oPrn:SetFont("code128",11,,,,255)  // please try different   value
> >  oPrn:TextOut("ÑABC!Ó",.t.)   // TEXT ready to TO PRINT
> >  oPrn:TextOut(code128("ABC"),.t.)   // TEXT TO PRINT IF YOU HAVE CONVERT
> FUNC
> > oPrn:NewPage()
> >
> >
> > follow is vb function  to convert
> > please share here your result
> >
> > Public Function code128$(chaine$)
> >  'Cette fonction est régie par la Licence Générale Publique Amoindrie
> > GNU (GNU LGPL)
> >  'This function is governed by the GNU Lesser General Public License (GNU
> LGPL)
> >  'V 2.0.0
> >  'Paramètres : une chaine
> >  'Parameters : a string
> >  'Retour : * une chaine qui, affichée avec la police CODE128.TTF,
> > donne le code barre
> >  '         * une chaine vide si paramètre fourni incorrect
> >  'Return : * a string which give the bar code when it is dispayed
> > with CODE128.TTF font
> >  '         * an empty string if the supplied parameter is no good
> >  Dim i%, checksum&, mini%, dummy%, tableB As Boolean
> >  code128$ = ""
> >  If Len(chaine$) > 0 Then
> >  'Vérifier si caractères valides
> >  'Check for valid characters
> >    For i% = 1 To Len(chaine$)
> >      Select Case Asc(Mid$(chaine$, i%, 1))
> >      Case 32 To 126, 203
> >      Case Else
> >        i% = 0
> >        Exit For
> >      End Select
> >    Next
> >    'Calculer la chaine de code en optimisant l'usage des tables B et C
> >    'Calculation of the code string with optimized use of tables B and C
> >    code128$ = ""
> >    tableB = True
> >    If i% > 0 Then
> >      i% = 1 'i% devient l'index sur la chaine / i% become the string
> index
> >      Do While i% <= Len(chaine$)
> >        If tableB Then
> >          'Voir si intéressant de passer en table C / See if
> > interesting to switch to table C
> >          'Oui pour 4 chiffres au début ou à la fin, sinon pour 6
> > chiffres / yes for 4 digits at start or end, else if 6 digits
> >          mini% = IIf(i% = 1 Or i% + 3 = Len(chaine$), 4, 6)
> >          GoSub testnum
> >          If mini% < 0 Then 'Choix table C / Choice of table C
> >            If i% = 1 Then 'Débuter sur table C / Starting with table C
> >              code128$ = Chr$(210)
> >            Else 'Commuter sur table C / Switch to table C
> >              code128$ = code128$ & Chr$(204)
> >            End If
> >            tableB = False
> >          Else
> >            If i% = 1 Then code128$ = Chr$(209) 'Débuter sur table B /
> > Starting with table B
> >          End If
> >        End If
> >        If Not tableB Then
> >          'On est sur la table C, essayer de traiter 2 chiffres / We
> > are on table C, try to process 2 digits
> >          mini% = 2
> >          GoSub testnum
> >          If mini% < 0 Then 'OK pour 2 chiffres, les traiter / OK for
> > 2 digits, process it
> >            dummy% = Val(Mid$(chaine$, i%, 2))
> >            dummy% = IIf(dummy% < 95, dummy% + 32, dummy% + 105)
> >            code128$ = code128$ & Chr$(dummy%)
> >            i% = i% + 2
> >          Else 'On n'a pas 2 chiffres, repasser en table B / We
> > haven't 2 digits, switch to table B
> >            code128$ = code128$ & Chr$(205)
> >            tableB = True
> >          End If
> >        End If
> >        If tableB Then
> >          'Traiter 1 caractère en table B / Process 1 digit with table B
> >          code128$ = code128$ & Mid$(chaine$, i%, 1)
> >          i% = i% + 1
> >        End If
> >      Loop
> >      'Calcul de la clé de contrôle / Calculation of the checksum
> >      For i% = 1 To Len(code128$)
> >        dummy% = Asc(Mid$(code128$, i%, 1))
> >        dummy% = IIf(dummy% < 127, dummy% - 32, dummy% - 105)
> >        If i% = 1 Then checksum& = dummy%
> >        checksum& = (checksum& + (i% - 1) * dummy%) Mod 103
> >      Next
> >      'Calcul du code ASCII de la clé / Calculation of the checksum ASCII
> code
> >      checksum& = IIf(checksum& < 95, checksum& + 32, checksum& + 105)
> >      'Ajout de la clé et du STOP / Add the checksum and the STOP
> >      code128$ = code128$ & Chr$(checksum&) & Chr$(211)
> >    End If
> >  End If
> >  Exit Function
> > testnum:
> >  'si les mini% caractères à partir de i% sont numériques, alors mini%=0
> >  'if the mini% characters from i% are numeric, then mini%=0
> >  mini% = mini% - 1
> >  If i% + mini% <= Len(chaine$) Then
> >    Do While mini% >= 0
> >      If Asc(Mid$(chaine$, i% + mini%, 1)) < 48 Or Asc(Mid$(chaine$,
> > i% + mini%, 1)) > 57 Then Exit Do
> >      mini% = mini% - 1
> >    Loop
> >  End If
> > Return
> > End Function
> >
> >
> >
> > 2010/1/31 smu johnson <[email protected]>:
> >> Hi.
> >>
> >> I've been Googling around for a solution to implement CODE128 (a b or c)
> >> barcodes... and haven't really found much.  Most of the stuff is
> >> undocumented, and the only free Clipper one I found doesn't say what
> Barcode
> >> standard it is.  Added to this futility, is the fact that the Internet
> does
> >> not seem to contain a simple .PDF or document that actually details the
> >> CODE128 standard!
> >>
> >> Then I thought, maybe I should just ask here.  Maybe this is a sign /
> omen
> >> that someone here already knows of a free solution for this.
> >>
> >> PS:  I'm just trying to output barcodes to a DoxMatrix type string.
> >>
> >> Thanks in advance
> >> --
> >> smu johnson <[email protected]>
> >> _______________________________________________
> >> Harbour-users mailing list (attachment size limit: 40KB)
> >> [email protected]
> >> http://lists.harbour-project.org/mailman/listinfo/harbour-users
> >>
> >
> >
> >
> > --
> > Massimo Belgrano
> >
> > Iscritto all'albo dei CTU presso il Tribunale di Novara per materia
> Informatica
> > Delta Informatica S.r.l. (http://www.deltain.it/) (+39 0321 455962)
> > Analisi e sviluppo software per Lan e Web -  Consulenza informatica -
> Formazione
> >
>
>
>
> --
> Massimo Belgrano
>
> Iscritto all'albo dei CTU presso il Tribunale di Novara per materia
> Informatica
> Delta Informatica S.r.l. (http://www.deltain.it/) (+39 0321 455962)
> Analisi e sviluppo software per Lan e Web -  Consulenza informatica -
> Formazione
> _______________________________________________
> Harbour-users mailing list (attachment size limit: 40KB)
> [email protected]
> http://lists.harbour-project.org/mailman/listinfo/harbour-users
>



-- 
smu johnson <[email protected]>
_______________________________________________
Harbour-users mailing list (attachment size limit: 40KB)
[email protected]
http://lists.harbour-project.org/mailman/listinfo/harbour-users

Reply via email to