ITF25码详解(附带PB代码)

演示 

                  

一、码表:

                                                          

字元0123456789
逻辑型态(n - 窄, w - 宽)nnwwnwnnnwnwnnwwwnnnnnwnwwnwnnnwwnnnnnwwwnnwnnwnwn

 

二、特点: 

1、条码只能表示【0-9】的数字。

2、组成条码的字符个数应为偶数(因为条码的条/空成对交叉),当字符是奇数个时,应在左侧补0变为偶数个(例如:123 变为 0123) 。

3、条码字符从左到右,奇数位置字符用条(黑色线条)表示,偶数位字符用空(白色线条)表示 。

4、 宽单元为窄单元的2-3倍。

5、条码组成:开始位(nnnn) + 条码位 + 结束位(wnn)

                       开始位:窄条,窄空,窄条,窄空。

                       结束位:宽条,窄空,窄条。

6、应用于商品批发、仓库、生产/包装识别、运输以及国际航空系统的机票顺序编号等 。

7、自校验校验码:校验码计算与UPC码相同,条码奇数位数字的和乘以3,加上偶数位的和,加上校验码等于该和的下一个为10的倍数的偶数。 例如, 条码 4963401, 那么 3 * (4+6+4+1) + (9+3+0) = 57. 57的下一个为10的倍数的偶数为60, 所以校验码为 3。

三、代码示例(PB9代码为例):

1、条码位成对交叉

例如条码号为:123456

码值为:wnnnw nwnnw wwnnn nnwnw wnwnn nwwnn

交叉过程:wnnnw nwnnw,wwnnn nnwnw,wnwnn nwwnn 两两一组交叉

交叉后:wnnwnnnnww wnwnnwnnnw wnnwwwnnnn

2、检验码

例如条码号为:1234567

奇数位相加乘以3:3*(1+3+5+7) = 48

偶数位相加:  (2+4+6) = 12

奇数位和+偶数位和:48+12 = 60 (取个位数:0)

10减去 - 个位数 = 检验码,:10 - 0 = 10 (若值为10,则取0)

检验码: 0

 

源码:

forward
global type w_main from window
end type
type sle_barcode from singlelineedit within w_main
end type
type cb_1 from commandbutton within w_main
end type
end forward

global type w_main from window
integer width = 3803
integer height = 1584
boolean titlebar = true
string title = "Untitled"
boolean controlmenu = true
boolean minbox = true
boolean maxbox = true
boolean resizable = true
long backcolor = 67108864
string icon = "AppIcon!"
boolean center = true
sle_barcode sle_barcode
cb_1 cb_1
end type
global w_main w_main

type variables
string is_clock[10,2]

statictext ivo_line[]
end variables

forward prototypes
public subroutine wf_initial ()
public function any wf_return_clock_array (string as_str)
public subroutine wf_reset ()
end prototypes

public subroutine wf_initial ();//0: nnwwn,1: wnnnw,2: nwnnw,3: wwnnn,4: nnwnw,5: wnwnn,6: nwwnn,7: nnnww,8: wnnwn,9: nwnwn 
//n - 窄, w - 宽

is_clock[1,1] = '0'
is_clock[1,2] = 'nnwwn'

is_clock[2,1] = '1'
is_clock[2,2] = 'wnnnw'

is_clock[3,1] = '2'
is_clock[3,2] = 'nwnnw'

is_clock[4,1] = '3'
is_clock[4,2] = 'wwnnn'

is_clock[5,1] = '4'
is_clock[5,2] = 'nnwnw'

is_clock[6,1] = '5'
is_clock[6,2] = 'wnwnn'

is_clock[7,1] = '6'
is_clock[7,2] = 'nwwnn'

is_clock[8,1] = '7'
is_clock[8,2] = 'nnnww'

is_clock[9,1] = '8'
is_clock[9,2] = 'wnnwn'

is_clock[10,1] = '9'
is_clock[10,2] = 'nwnwn'





end subroutine

public function any wf_return_clock_array (string as_str);int li_for,li_for2
string ls_clockArray[],ls_charStr,ls_clock

for li_for =1 to len(as_str)
	ls_charStr = mid(as_str,li_for,1)
	ls_clock = ''

	for li_for2 =1 to upperbound(is_clock)
		if ls_charStr = is_clock[li_for2,1] then
			ls_clock = is_clock[li_for2,2]
			exit
		end if
	next
	
	if ls_clock <> '' then ls_clockArray[upperbound(ls_clockArray) + 1] = ls_clock
next


return ls_clockArray
end function

public subroutine wf_reset ();int li_for

for li_for = 1 to upperbound(ivo_line)
	closeuserobject(ivo_line[li_for])
next
end subroutine

on w_main.create
this.sle_barcode=create sle_barcode
this.cb_1=create cb_1
this.Control[]={this.sle_barcode,&
this.cb_1}
end on

on w_main.destroy
destroy(this.sle_barcode)
destroy(this.cb_1)
end on

event open;wf_initial()
end event

type sle_barcode from singlelineedit within w_main
integer x = 2143
integer y = 496
integer width = 848
integer height = 128
integer taborder = 10
integer textsize = -12
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Arial"
long textcolor = 33554432
string text = "123456"
borderstyle borderstyle = stylelowered!
end type

type cb_1 from commandbutton within w_main
integer x = 2187
integer y = 822
integer width = 457
integer height = 128
integer taborder = 10
integer textsize = -12
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Arial"
string text = "none"
end type

event clicked;string ls_clockArray[]
char ls_bit[],ls_null[],ls_bit2[]
long ll_for,ll_for2
string ls_text,ls_clock,ls_char,ls_barcode
any arr[]
statictext line
long ll_x = 100,ll_y = 100
long ll_oddNumber =0,ll_evenNumber =0,ll_number

wf_reset()

ls_barcode = sle_barcode.text

if not isnumber(ls_barcode) then
	return
end if

if mod(len(ls_barcode),2) <> 0 then
	ls_barcode = '0' + ls_barcode
	//检验位
//	for ll_for = 1 to len(ls_barcode)
//		ls_char = mid(ls_barcode,ll_for,1)
//		
//		if mod(ll_for,2) = 0 then
//			ll_evenNumber = ll_evenNumber+long(ls_char)
//		else
//			ll_oddNumber = ll_oddNumber+long(ls_char)
//		end if
//	next
//	
//	ll_number =(3*ll_oddNumber) + ll_evenNumber
//	ll_number = 10 -long(right(string(ll_number),1))
//	if ll_number = 10 then ll_number = 0
//	ls_barcode = ls_barcode+string(ll_number)
end if

//码值  数组
ls_clockArray = wf_return_clock_array(ls_barcode)

//字符串转换成字符数组
//[[n,n,w,w,n],[n,n,w,w,n],[n,n,w,w,n],[n,n,w,w,n]]
for ll_for = 1 to upperbound(ls_clockArray)
	ls_clock = ls_clockArray[ll_for]
	ls_bit = ls_null
	
	for ll_for2 = 1 to len(ls_clock)
		ls_bit[upperbound(ls_bit)+1] = mid(ls_clock,ll_for2,1)
	next
	arr[upperbound(arr)+1] = ls_bit
next

//2组,2组交叉
for ll_for2 = 1 to upperbound(arr) step 2
	ls_bit = arr[ll_for2]
	ls_bit2 = arr[ll_for2 + 1]
	
	for ll_for = 1 to 5
		ls_text = ls_text + ls_bit[ll_for]+ ls_bit2[ll_for]
	next
next

//ITF25码开始模式为窄条,窄空,窄条,窄空,非条码字符 
//ITF25码结束模式为宽条,窄空,窄条,非条码字符 
ls_text = 'nnnn'+ ls_text + 'wnn'

//画
for ll_for = 1 to lenW(ls_text)
	ls_char = mid(ls_text,ll_for,1)
	
	line = create statictext
	line.backcolor = 0
	line.width = 10
	line.height = 200
	
	if mod(ll_for,2) = 0 then line.backcolor = 16777215
	if ls_char = 'w' then line.width = 25
	
	openuserobject(line,ll_x,ll_y)
	ivo_line[upperbound(ivo_line) + 1] = line
	ll_x = ll_x + line.width
next




end event

 

 

  • 1
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

菜鸟--\(˙<>˙)/--战斗机

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值