前に作ったのをモジュールにしてみた
#module "mod_BarCodeDraw"
#const BCM 7 /*1文字のモジュール数*/
#const GBM 3 /*ガードバーモジュール数*/
#const CBM 5 /*センターバーモジュール数*/
#const GBCode %101 /*ガードバー*/
#const CBCode %01010 /*センターバー*/
//「BarCodeDraw」バーコードを描画(余白を含む)
//BarCodeDraw str_cn ,_x ,_y ,sx ,sy
//str_cn = 13桁のコード文字列(入力が12桁だった場合チェックデジットを付加)
//_x = X座標(余白を含む)
//_y = Y座標
//sx = モジュールサイズX(バー1つの幅)
//sy = モジュールサイズY
//「返り値」statにチェックデジットが返る、-1ならエラー
#deffunc BarCodeDraw var str_cn,int _x ,int _y ,int sx,int sy
if Binary_Code=0 {//初回だけ配列にデータを設定
//左側文字用バイナリーコード
dim Binary_code,10,3
Binary_Code(0,0)/*偶数パリティ*/=%0100111,%0110011,%0011011,%0100001,%0011101,%0111001,%0000101,%0010001,%0001001,%0010111
Binary_Code(0,1)/*奇数パリティ*/=%0001101,%0011001,%0010011,%0111101,%0100011,%0110001,%0101111,%0111011,%0110111,%0001011
//右側文字用バイナリーコード
Binary_Code(0,2)/*偶数パリティ*/=%1110010,%1100110,%1101100,%1000010,%1011100,%1001110,%1010000,%1000100,%1001000,%1110100
//左側6文字の奇数・偶数の組合せ(0が偶数、1が奇数)
dim OddEven,6,10
OddEven(0,0)=1 ,1 ,1 ,1 ,1 ,1
OddEven(0,1)=1 ,1 ,0 ,1 ,0 ,0
OddEven(0,2)=1 ,1 ,0 ,0 ,1 ,0
OddEven(0,3)=1 ,1 ,0 ,0 ,0 ,1
OddEven(0,4)=1 ,0 ,1 ,1 ,0 ,0
OddEven(0,5)=1 ,0 ,0 ,1 ,1 ,0
OddEven(0,6)=1 ,0 ,0 ,0 ,1 ,1
OddEven(0,7)=1 ,0 ,1 ,0 ,1 ,0
OddEven(0,8)=1 ,0 ,1 ,0 ,0 ,1
OddEven(0,9)=1 ,0 ,0 ,1 ,0 ,1
}
//コード文字列を数値に変換し配列に代入、チェックデジット計算チェック(チェックデジットが無ければ付加)
a=0
b=0
dim cn,13
repeat 12 //チェックデジットの最終桁は除外
cn(cnt)=int(strmid(str_cn,cnt,1))//コード文字列を数値に変換し配列に代入
if (cnt\2)=1 {a+cn(cnt)}else{b+cn(cnt)}//{右端から見て偶数桁を加算}else{右端から見て奇数桁を加算}
loop
a*3
b+a
cd=(10-(b\10))\10 //チェックデジット
if strlen(str_cn) = 13 {//チェックデジットが含まれてる
if cd ! int(strmid(str_cn,12,1)) {dialog "チェックデジット不一致\ncd = "+cd:gradf _x,_y,sx*(12*7+11+11*2),sy+sx*7,0,$ffffff,$ffffff:return -1}
}else{//チェックデジットが無い
str_cn+str(cd) //チェックデジットを付加
}
cn(12)=cd //チェックデジット付加
x=_x
y=_y
//バーコードの下地を白で描画(余白含む)
gradf x,y,sx*(12*7+11+11*2),sy+sx*7,0,$ffffff,$ffffff //12*7(文字数*1文字分のモジュール数) 11(ガードバー+センターバー+ガードバー) 11*2(余白*2)
font "MS UI Gothic",sx*7,0
pos x+sx*5,y+sy
mes cn(0) //左下に最初のナンバーを表示
x+=sx*11 //左余白分を加算
BarSpace x,y,sx,sy+sx*7/2,GBCode,GBM //左側のガードバー描画
number_index=0
AddedNo=cn(number_index) //先頭の付加文字
//左側バーコード
repeat 6
number_index++
number=cn(number_index) //コードナンバー代入
pos x+sx*2,y+sy
mes number //バーコード下部にナンバー表示
oe=OddEven(cnt,AddedNo) //奇数・偶数代入
B_C=Binary_Code(number,oe) //バイナリーコード代入
BarSpace x,y,sx,sy,B_C,BCM //バーコードを描画
loop
BarSpace x,y,sx,sy+sx*7/2,CBCode,CBM //センターバー描画
//右側バーコード
repeat 6
number_index++
number=cn(number_index)
pos x+sx*2,y+sy
mes number
B_C=Binary_Code(number,2) //バイナリーコード代入
BarSpace x,y,sx,sy,B_C,BCM //バーコードを描画
loop
BarSpace x,y,sx,sy+sx*7/2,GBCode,GBM //右側のガードバー描画
sysfont 0
return cd
//「BarSpace」1文字分(最大7モージュール)のバーコードを描画
//Barcode _x ,_y ,sx ,sy ,bc ,m
//_x = X座標(余白を含む)//次の描画位置が出力される
//_y = Y座標
//sx = モジュールサイズX(バー1つの幅)
//sy = モジュールサイズY
//bc = バイナリーコード
//m = 描画するモジュール数
#deffunc BarSpace var _x ,int _y ,int sx ,int sy ,int bc,int m
i=1<<(m-1) //上位ビットから描画するからモジュール数分の最上位ビットにビットシフト
repeat limit(m,0,7)
col=$ffffff*((bc&(i>>cnt))=0) //上位ビットから取得(0ならスペース(白))
gradf _x,_y,sx,sy,0,col,col
_x+sx
loop
return
#global
cls 3
//モジュールサイズ(バー1本のサイズ)
ModuleSizeX=2
ModuleSizeY=56
//バーコード表示位置(余白含む)
posx=50
posy=100
//13桁のコードナンバー(最終桁(チェックデジット)を除いた12桁でも可)
codenumber="1234567890128"
objmode 2,1
input codenumber,110,20,13
cnid=stat
button "更新" ,*Barcode
*Barcode
//「BarCodeDraw」バーコードを描画(余白を含む)
BarCodeDraw codenumber,posx,posy,ModuleSizeX,ModuleSizeY
if stat>=0 {title ""+"チェックデジット = "+stat}else{title "チェックデジットを修正するか削除してください"}
objprm cnid,codenumber
stop