COMPOSANT CODE BARRE 39-EAN13-EAN8

florenth - 31 juil. 2007 à 12:25
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021 - 12 oct. 2013 à 14:56
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/43619-composant-code-barre-39-ean13-ean8

PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
12 oct. 2013 à 14:56
Personnellement, j'utilise la fonte Code39r.ttf téléchargeable gratuitement.
Je crée un TRichEdit dans lequel il est possible de choisir sa fonte, ligne par ligne.
par exemple:
SIDcong:= Edit1.Text;
RichEdit1.Clear;
RichEdit1.SelAttributes.Size:=30;
RichEdit1.SelAttributes.Name:='code39';
RichEdit1.SetSelText(SIDcong + #13#10); //impression du barcode
RichEdit1.SelAttributes.Size:=10;
RichEdit1.SetSelText(' '+SIDcong); //impression en format lisible
Richedit1.Visible:=True; //visu rapide avant impression; Richedit est visible:=False par défault
Richedit1.Print('My Document Name');
sleep(1500);
Richedit1.Visible:=False;

De plus il est possible de charger la fonte dynamiquement uniquement pour l'appli (sur form create):
//--------------chargement de la fonte barcode 39----------------------------------
AddFontResource('c:\code39r.TTF') ;
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) ;
puis déchargement quand on quitte (sur FormDestroy):
//--------------déchargement de la fonte barcode 39----------------------------------
RemoveFontResource('c:\code39r.TTF') ;
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) ;
dvarrel Messages postés 13 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 7 octobre 2007
7 oct. 2007 à 19:25
tu as raison pour l'icône, j'aurais du joindre le fichier barcode.dcr, qui contient l'icône pour la palette de composant. je mets à jour ceci, si tu veux que l'icône apparaisse, il te faut desinstaller le composant puis le réinstaller.

non, je ne suis pas un pro, seulement un peu touche à tout.
Hrod Messages postés 6 Date d'inscription mercredi 22 novembre 2006 Statut Membre Dernière intervention 7 octobre 2007
7 oct. 2007 à 10:57
Encore moi... pour dire : super ! J'ai enfin téléchargé cette bibliothèque "graphicex" et réinstallé le composant, tout fonctionne désormais à la perfection.

Bravo Damien, j'aimerais être capable de faire des choses pareilles.

Seul petit regret, c'est que l'icone du composant dans la palette ne soit plus la même. Comme je ne sais pas du tout comment la changer, elle restera ainsi.

En attendant, une fois encore, un grand MERCI.
Hrod Messages postés 6 Date d'inscription mercredi 22 novembre 2006 Statut Membre Dernière intervention 7 octobre 2007
7 oct. 2007 à 10:04
Merci Dvarrel, je suis un peu rassuré ! Et bravo pour ta rapidité d'intervention, c'est du "top moumoute". Professionnel ?

Je suis décidément très nul (ho oui!!!) mais maintenant je n'arrive pas à dégotter ce "graphicex.dcu" requis. Faut dire que quand il y a un gravier dans les lentilles, il est pour moi ! lol!

Merci encore pour ton aide en tous cas.
dvarrel Messages postés 13 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 7 octobre 2007
7 oct. 2007 à 09:16
tu as raison Hrod, il y avait un bug dans mon prog. C'est désormais résolu.

les propriétés du composant :
composant codebarre 39 EAN8 EAN13, redimensionnable
propriété BarCodeType : type du code barre
propriété BarWidth : largeur des barres de base
propriété BarWidthXL : largeur des barres larges
propriété Code : le code barre à afficher
propriété WithText : avec ou sans le code en texte clair
propriété bitmap : contient le bitmap du code barre
propriété printratio : facteur d'échelle pour la propriété bitmapforprint
propriété bitmapforprint : contient le bitmap du code barre mis à l'échelle avec printratio
propriété IsfixedWidth : force la largeur du codebarre (peut dégrader la qualité)

damien varrel
dvarrel Messages postés 13 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 7 octobre 2007
6 oct. 2007 à 21:00
je regarde et te tiens au courant
Hrod Messages postés 6 Date d'inscription mercredi 22 novembre 2006 Statut Membre Dernière intervention 7 octobre 2007
6 oct. 2007 à 20:16
Mais si Dvarrel, de beaucoup ! Ces composants sont rares, celui-là est une aubaine précieuse.

Mais j'ai besoin d'un peu d'aide, car j'ai toujours un pb que je n'arrive pas à cerner. quand je rentre le code brut 08105839935, par exemple, le composant affiche 3081058993510 - donc complété du trailing et de la checksum i presume -- mais le "3" entre le "8" et le "9" disparait. Est-ce normal (un effet du codage prévu par la norme ?) ou est-ce encore moi qui marche à coté de mes lignes de code ? J'ai tendance à penser que c'est normal car le code produit est lisible par la douchette, qui sort 3081058993510, donc toujours pas de "3" -- ce qui là encore me semble normal puisqu'il n'est plus dans le code graphique produit par le composant -- mais je suis étonné que le décodeur ne restitue pas le chiffre manquant (s'il sagissait d'un calcul, il serait peut être restituable sous certaines conditions ?), ce qui me fait douter du code graphique produit...

Bref, je patauge lamentablement. Coin coin coin !

Je précise pour ceux que mon ignorance flagrante pourrait énerver que je n'ai pas programmé depuis bientôt 10 ans... et que c'est très dur de s'y remettre, surtout à mon âge avancé !
dvarrel Messages postés 13 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 7 octobre 2007
6 oct. 2007 à 19:06
de rien...
Hrod Messages postés 6 Date d'inscription mercredi 22 novembre 2006 Statut Membre Dernière intervention 7 octobre 2007
6 oct. 2007 à 17:56
Hum...
Au temps pour moi, c'était une erreur de ma part : ce composant marche à la perfection. Merci à son auteur et à tous ceux qui ont contribué à son amélioration.
Hrod Messages postés 6 Date d'inscription mercredi 22 novembre 2006 Statut Membre Dernière intervention 7 octobre 2007
6 oct. 2007 à 13:09
Bonjur
Fameux composant, et très utile ! En tous cas pour moi, je remercie son auteur.
Cependant il me semble qu'il y a des erreurs de calcul par moments, ou alors c'est moi qui fait une mauvaise manip.
Par exemple en mode ean13, si j'entre le nombre 308100798932, le composant code 3081007989236 --> au lieu de xxx89326 pensais-je.

Est-ce vraiment un petit bug ou est-ce moi qui suis trop fatigué pour voir mes erreurs ? :)
D'une je ne suis pas l'auteur de ce composant.
De deux, le composant BarCode est dans le zip, et c'est justement tout l'intérêt de cette source.

Faudrait quand même réfléchir par moments... à se demander si tout le monde sait ce que ça veut dire.
copass35 Messages postés 1 Date d'inscription jeudi 12 octobre 2006 Statut Membre Dernière intervention 11 septembre 2007
11 sept. 2007 à 10:35
salut florenth
j'ai essayé d'exécuter le composant codebarre
mais il me manque un composant TbarCode qu je n'ai pas pus trouver.
Merci de ton aide
dvarrel Messages postés 13 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 7 octobre 2007
2 août 2007 à 16:49
@philu :

je ne me sers pas du code 128, par contre je vais intégrer le code EAN13 très utilisé dans le commerce (tous les produits ont un code EAN13)
dvarrel Messages postés 13 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 7 octobre 2007
2 août 2007 à 16:46
merci F0xi pour tes conseils mais je souhaite que mon code reste le plus lisible possible, et on n'est pas à 100 octets près de nos jours, surtout pour une constante :)

pour les méthodes de propriétés, peux-tu confirmer car j'avais regarder dans plusieurs tuto avant de les mettre dans protected
Utilisateur anonyme
2 août 2007 à 09:18
génial!!!
A quand le code 128?
Encore bravo!
PhilLu
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
2 août 2007 à 02:56
on peu egalement faire ceci :

C39 : array[0..43] of word =
($0064, // 0
$0091, // 1
$0061, // 2
$0160, // 3
$0031, // 4
$0130, // 5
$0050, // 6
$0025, // 7
$0124, // 8
$0064, // 9
ect ...


et on recupere facilement comme ceci :

bit 0 : (C39[index] and $0001) = $0001 (bit 0 = 1)
bit 1 : (C39[index] and $0002) = $0002 (bit 1 = 1)
bit 2 : (C39[index] and $0004) = $0004 (bit 2 = 1)
bit 3 : (C39[index] and $0008) = $0008 (etc)
bit 4 : (C39[index] and $0010) = $0010
bit 5 : (C39[index] and $0020) = $0020
bit 6 : (C39[index] and $0040) = $0040
bit 7 : (C39[index] and $0080) = $0080
bit 8 : (C39[index] and $0100) = $0100

ce qui fait passer le tableaux de code de 44*9 octets a 44*2 octets.


et les methodes de propriétés sont censée toujours etre dans private et non protected.

procedure SetCode(ACode:string);
procedure SetBarWide(ABarWide:integer);
procedure SetBarNarrow(ABarNarrow:integer);
dvarrel Messages postés 13 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 7 octobre 2007
31 juil. 2007 à 23:36
c'est fait !
Pour l'exemple: c'est juste histoire d'avoir un projet tout fait dans lequel il y a un édit permettant de changer le code barre sans avoir de besoin d'installer le composant, de créer un nouveau projet, de le poser et de faire quelques tests.
Les gens sont faignants de nos temps ^^

Et merci pour le "-1", j'avais totalement zappé (j'ai écris le code en live, pas testé dans delphi).

A quand une petite mise à jour ?
dvarrel Messages postés 13 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 7 octobre 2007
31 juil. 2007 à 14:47
il faut mettre :

# TraceCode(Pos(FCode[i], AuthorizedChars)-1);

au lieu de :

# TraceCode(Pos(FCode[i], AuthorizedChars));

:)
dvarrel Messages postés 13 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 7 octobre 2007
31 juil. 2007 à 14:19
merci Florenth,


pour le code d'exemple, il n'y a pas grand chose à dire, à part poser le composant sur une fiche, et changer sa propriété "Code" !

Après dépendant de l'appli on imprime le code barre (moi j'exporte mes listes de codebarre en pdf avec un compo freeware).
Pour un premier composant visuel, je trouve celui ci très soigné. Continue comme ça ^^
Sinon, petite amélioration: comme l'ordre de tes 44 cases du tableau est le même que ta chaîne AuthorizedChars, tu peux tout simplement le déclarer comme

C39: array[0..43, 0..8] Byte =
((0,0,0,1,1,0,1,0,0), // Pour le caractère '0'
(1,0,0,1,0,0,0,0,1), // Pour le caractère '1'
...,...); // etc...

Ce qui te permet d'économiser une boucle dans la procédure Paint().
En effet, ceci:
# //Car. Composition B S B S B S B S B
# X1:=0;
# for i:=1 to length(Fcode) do
# begin
# //cherche le caractère et trace le code
# for j:=0 to length(C39)-1 do
# if C39[j].C=Fcode[i] then
# begin
# TraceCode(j);
# break;
# end;
# end;

devient cela :
# for i := 1 to length(FCode) do
# TraceCode(Pos(FCode[i], AuthorizedChars));

De même, tous les C39[index].B[i] seront transformés en C39[index, i] et les C39[index].C en AuthorizedChars[index]

Ceci permet d'éviter une duplication des données !

Sinon, un petit code d'exemple serait le bienvenu !

A +
Flo
Rejoignez-nous