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