HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
1024
グラスバーコードリーダーで読み込んだ値からバーコードを生成するには・・・7解決


グラス

リンク

2012/10/24(Wed) 23:12:04|NO.50205

バーコードリーダーで読み込んだJANコード(13桁)をstrmidで13個に分け、
その値から再び画面内にJANコードを生成したいと考えているのですが、
その方法が思い浮かびません・・・
私自身バーコードの理解が深くないのも原因なのですが
とりあえず13桁の値を、

a=strmid( codenumber , 0 , 1 ) b=strmid( codenumber , 1 , 1 ) c=strmid( codenumber , 2 , 1 ) d=strmid( codenumber , 3 , 1 ) e=strmid( codenumber , 4 , 1 ) f=strmid( codenumber , 5 , 1 ) g=strmid( codenumber , 6 , 1 ) h=strmid( codenumber , 7 , 1 ) i=strmid( codenumber , 8 , 1 ) j=strmid( codenumber , 9 , 1 ) k=strmid( codenumber , 10 , 1 ) l=strmid( codenumber , 11 , 1 ) m=strmid( codenumber , 12 , 1 )
というふうにa〜mの変数に分け、
aは国コードなので除外した残りのb〜mで生成したいと考えています。
バーコードを生成するフリーソフトはありますが、HSPで作りたいのでご指導お願いします。
ちなみに画像としてBMP等で吐き出したいわけではなく、画面に表示できれば良いです。
よろしくお願いします。



この記事に返信する


MillkeyWeler

リンク

2012/10/25(Thu) 07:29:25|NO.50210

JANコードなどは、事前に計算されてるので、ある数字が一定の画像情報での出力(画面に表示)はできない。
URL 提供だけで申し訳ないが、下記URL を参考にして作ってみてはいかが?

[参考URL] http://www7.plala.or.jp/nekogrammer/barcode/barcode1.htm

法則・計算式だけわかれば、難しいことでもないと思うし、チャレンジがんばです!



グラス

リンク

2012/10/25(Thu) 09:40:14|NO.50212

ありがとうございます!
帰宅しだい拝見させていただきます〜
まだ不安ではあるので、回答の受け付けは続けたいと思います。



暇人

リンク

2012/10/25(Thu) 21:20:07|NO.50229

>aは国コードなので除外した残りのb〜mで生成したいと考えています。
国コードはa,bの二桁
左側のバーコードを作るのにaが必要
除外は出来ない

aが4の時bが9ならこのバーコードと決められてるので
必要分(左側0〜9を各2種類、右側0〜9で合わせて30枚)の
バーコード画像を作って貼り付ける方がプログラム的には楽になる
(左右のガードバーとセンターバーも必要だが)


自分が作った時は
http://www5d.biglobe.ne.jp/~bar/spec/barspec.html
ここを参考にした



暇人

リンク

2012/10/26(Fri) 00:36:24|NO.50237

前に作ったのをモジュールにしてみた


#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



暇人

リンク

2012/10/26(Fri) 02:13:20|NO.50239

>//Barcode _x ,_y ,sx ,sy ,bc ,m
>//_x = X座標(余白を含む)//次の描画位置が出力される
コメントが間違ってた
「余白を含む」は無し



グラス

リンク

2012/10/26(Fri) 08:31:54|NO.50242

>暇人さん
ありがとうございます!
昨晩も結局成功しなかったので、
帰り次第暇人さんのモジュールを利用させていただきたいと思います!



グラス

リンク

2012/10/26(Fri) 17:43:47|NO.50245

>暇人さん
モジュールを用いて無事解決することが出来ました!
この度は本当に有難うございます。



ONION software Copyright 1997-2021(c) All rights reserved.