一、條形碼的讀取
在都安等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計 網(wǎng)站設(shè)計制作定制設(shè)計,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營銷型網(wǎng)站建設(shè),外貿(mào)網(wǎng)站建設(shè),都安網(wǎng)站建設(shè)費用合理。
用過鍵盤口式的掃條碼工具的朋友就知道,它就如同在鍵盤上按下數(shù)字鍵一樣,基本不需任何編程和處理。但如果你使用的是其它接口的話,可能你就要為該吵肆培設(shè)備編寫通訊代碼了。以下有一段簡單的25針串口的條碼讀取器通訊代碼。
Option Explicit
Dim sData As String
Private Sub Form_Load()
With MSComm1
.CommPort = 3 '設(shè)為COM3,試運行的系統(tǒng)而定,你可提供一個Combox讓用戶選擇。
.PortOpen = True '打開通訊端口
End With
End Sub
Private Sub MSComm1_OnComm()
Dim EndPos As Integer
Select Case MSComm1.CommEvent
Case comEvReceive '當有數(shù)據(jù)傳送過來時
sData = sData Trim(MSComm1.Input)
'檢索回車,通常讀卡雹激機每組數(shù)據(jù)結(jié)尾都返回一個回車作為結(jié)束符
EndPos = InStr(1, sData, Chr(13))
If EndPos = 0 Then '如果未結(jié)束就繼續(xù)努力
Else '讀完一組。
lblBarCode.Caption = sData '顯示一組條形碼
With lstBarCode
.AddItem Mid(sData, 1, EndPos - 1) '添加一組條形碼到列表
End With
sData = "" '清空
End If
End Select
End Sub
Private Sub cmdEnd_Click()
MSComm1.PortOpen = False '關(guān)閉端口
End
End Sub
二:條形碼的生成
在VB上編程本來就不難。以下關(guān)于條形碼生成的代碼也是很容易理解,只需使用一個OFFICE的附帶的 BarCode控件就可以輕松打印出11種不同標準的條形碼,足以滿足我們的要求。想起我書架上的一本書中的一篇用Turbo C編寫條形碼打印程序文章,長篇大論,那時不知看了n天,打了n小時字結(jié)果也不盡人意,現(xiàn)在真是幸福多了:)。廢話說完,得回歸正題。且看條形碼生成的代碼及有關(guān)說明。
源代碼主要由兩個窗體(frmMain主窗體和frmOption條碼設(shè)置窗體)和兩個模塊組成(modGetScreen.bas、SysDLG32.bas)。考慮到篇幅,這里只列出部分較為關(guān)鍵的代碼。
新建一個標準工程,添加一個名為(Microsoft Access BarCode
Control9)的條形碼部件,并添加一個條碼控件到窗口,并將窗口改名為frmMain,如圖所示。由于控件比較多,這里不便細說,詳細內(nèi)容請看源代碼。
模塊modGetScreen.bas代碼如下:
Option Explicit
聲明BitBlt、GetDesktopWindow、GetWindowDC、ReleaseDC這幾個API函數(shù)略
Public RegUser As Boolean
Sub GetObjImage1(Obj As Object, OwnerForm As PictureBox, Picture1
As PictureBox)
'hDC
Dim hWndDesk As Long
Dim hDCDesk As Long
'升唯區(qū)域表達變量
Dim x As Long
Dim y As Long
Dim w As Long
Dim h As Long
x = Obj.Left Screen.TwipsPerPixelX
y = Obj.Top Screen.TwipsPerPixelY
w = Obj.Width Screen.TwipsPerPixelX
h = Obj.Height Screen.TwipsPerPixelY
hDCDesk = OwnerForm.hdc
'取出圖像
Call BitBlt(Picture1.hdc, 0, 0, w, h, hDCDesk, x, y,
vbSrcCopy)
Call ReleaseDC(hWndDesk, hDCDesk)
End Sub
主窗體frmMain.frm部分代碼如下:
Private Sub cmdPrint_Click()
'生成條形碼圖像
Dim r As Long, i As Integer, t As String,cfile As
String '臨時變量
t = BarCode
For i = 0 To Val(Times) - 1
BarCode1.Value = BarCode + i
DoEvents
Picture1.Refresh
GetObjImage1 BarCode1, Conel, Picture1
If RegUser = False Then '如果未注冊添加MASK標記
Picture1.PaintPicture Picture2.Picture, 300, 300
End If
If Dir(SavePath, vbDirectory) = "" Then MkDir SavePath
SavePath = SavePath IIf(Right(SavePath, 1) "", "",
"")
cfile = SavePath BarCode1.Value ".bmp"
SavePicture Picture1.Image, cfile '將條形碼保存為圖像文件以便打印
Next
BarCode = t
End Sub
條形碼設(shè)置窗體frmOption.frm代碼如下:
Option Explicit
'條形碼設(shè)置模塊
Private Sub cboBig_Click()
BarCode1.Style = cboBig.ListIndex '改變標準
End Sub
Private Sub cboDirection_Click()
BarCode1.Direction = cboDirection.ListIndex '改變方向
End Sub
Private Sub cboLine_Click()
BarCode1.LineWeight = cboLine.ListIndex '改變線寬
End Sub
Private Sub cboSmall_Click()
BarCode1.SubStyle = cboSmall.ListIndex '改變樣式
End Sub
Private Sub Check1_Click()
BarCode1.ShowData = Check1.Value '是否顯示數(shù)據(jù)
End Sub
Private Sub cmdChange_Click()
'設(shè)置長、寬大小
BarWidth = BarCode1.Height
BarHeight = BarCode1.Width
cmdRefresh_Click
End Sub
Private Sub cmdOK_Click()
'傳送條形碼設(shè)定到主界面
With frmMain.BarCode1
.LineWeight = BarCode1.LineWeight
.Style = BarCode1.Style
.SubStyle = BarCode1.SubStyle
.Direction = BarCode1.Direction
.Width = BarCode1.Width
.Height = BarCode1.Height
.ShowData = BarCode1.ShowData
Me.Hide
End With
With frmMain
.Picture1.Width = .BarCode1.Width
.Picture1.Height = .BarCode1.Height
.Conel.Width = .BarCode1.Width
.Conel.Height = .BarCode1.Height
End With
End Sub
Private Sub cmdRefresh_Click()
BarCode1.Width = BarWidth
BarCode1.Height = BarHeight
End Sub
Private Sub Form_Load()
LoadBarInfo
BarWidth = BarCode1.Width
BarHeight = BarCode1.Height
End Sub
Sub LoadBarInfo() '初始化選項
LoadBigClass cboBig
LoadSmallClass cboSmall
LoadLineSize cboLine
LoadDirection cboDirection
End Sub
Sub LoadBigClass(cbo As ComboBox) '條碼標準
With cbo
.AddItem "UPC-A"
.AddItem "UPC-E"
.AddItem "EAN-13"
.AddItem "EAN-8"
.AddItem "Case Code"
.AddItem "Codabar (NW-T)"
.AddItem "Code-39"
.AddItem "Code-128"
.AddItem "U.S. Postnet"
.AddItem "U.S. Postal FIM"
.AddItem "JP Post"
.ListIndex = 2
End With
End Sub
Sub LoadSmallClass(cbo As ComboBox) '條碼樣式
With cbo
.AddItem "Standard"
.AddItem "2-Digit Supplement"
.AddItem "5-Digit Supplement"
.AddItem "POS Case Code"
.ListIndex = 0
End With
End Sub
許多人在編寫數(shù)據(jù)庫應(yīng)用程序時,都想要加上條形碼功能加強工作效率,尤其是銷售管理,圖書館管理這類流量大的應(yīng)用軟件,但由于條形碼技術(shù)難以掌握、標誰又多以及過去的技術(shù)種種原因,使得許多人望而卻步。本文介紹的一套簡單實用的條形碼解決方法,希望能幫助各位完善軟件系統(tǒng)的功能。
很則高簡單。只需要安裝Code39字體,或者加載到系統(tǒng)中就可以。
報表設(shè)置該字體自孫凱尺然就表孫配示成條形碼了。
Code39字體從網(wǎng)上搜索能搜索到。
本文的討論也將著眼于這兩種情況 首先是當程序員需要動態(tài)建立一個控件并將代碼附著于控件之上時 例如 你或許想創(chuàng)建一個鏈接列表 但是不知道需要創(chuàng)建鏈接的數(shù)量或是鏈接中會出現(xiàn)什么樣的數(shù)據(jù) 第二種是當備陪敬程序員需要定義代碼以反映出特殊需求的時候 例如 你或許要執(zhí)行能反映用戶系統(tǒng)配置的代碼
類似上述的情況當然不會每天都上演 事實上 它們只在非常情況下才出現(xiàn) 然而 作為程序員 仍然要意識到 NET為解決動態(tài)情形提供了方案 有了正確的技巧 你就可以寫出能靈活處理動態(tài)情況的應(yīng)用程序了
使用動態(tài)控件
許多程序員總會遇到需要動態(tài)創(chuàng)建控件的時候 我們所展示的例子中程序員向FlowLayoutPanel中添加了LinkLabels 或許你可以個這樣的設(shè)置來記錄和保存常用的URL 文件 網(wǎng)絡(luò)地址或是其他資源所在位置的數(shù)值 這一示例沒有真正保存鏈接 但是你可以使用XML序列化功能來實現(xiàn)保存
每次當用戶點擊Test按鈕時 示例代碼就會動態(tài)創(chuàng)建一個新的LinkLabel控件 真正的演示代碼并不復雜 例一就展示了創(chuàng)建這類控件以及將控件放入FlowLayoutPanel lstLabel中通常所需要做的一切
例一 向FlowLayoutPanel中添加新的鏈接 ?Private Sub btnTest_Click() Handles btnTest Click Create a link Dim NewLink As LinkLabel =New LinkLabel() Add some properties to it NewLink Text = DateTime Now ToLongTimeString() Set the click event handler AddHandler NewLink Click AddressOf NewLink_Click Place the button on the form lstLinks Controls Add(NewLink) End Sub
如你所料 該代碼開始的時候創(chuàng)建了一個新的LinkLabel并為其賦予了一些值 這一示例使用的是當前時間 你的代碼或許能夠?qū)δ骋徽鎸嵸Y源進行訪問
請注意該代碼也向鏈接的Click事件中指定了一個處理程序 你必須使用示例中的AddHandler技巧 因為普通的Handles關(guān)鍵詞路徑不起作用 一方面 設(shè)計應(yīng)用程序的時候你并不清仿慎楚控件的名稱 即便你為控件指定了一個名稱 你也不知道用戶要創(chuàng)建的控件數(shù)量 所以我們沒有辦法清楚會有多少處理程序會被創(chuàng)建 處理程序的代碼與控件代碼類似 因亂櫻此沒有必要創(chuàng)建多個處理程序 用于這個示例的處理代碼見例二 例二 處理動態(tài)控件點擊事件 ?Private Sub NewLink_Click( _ ByVal sender As System Object ByVal e As System EventArgs) Verify that you actually have a LinkLabelIf Not sender GetType() Is GetType(LinkLabel) ThenMessageBox Show( Wrong control type provided! )ReturnEnd If Convert the input sender to a Button Dim ThisLink As LinkLabel = sender Show that we have the correct button MessageBox Show( You created this link at: + ThisLink Text)End Sub
你可能已經(jīng)注意到例一中的事件處理器使用的是寬松代表——它沒有將ByVal發(fā)送器作為System Object 也沒有將ByVal e作為System EventArgs作為參數(shù)因為它不需要這二者 然而 當你創(chuàng)建一個事件處理器來動態(tài)創(chuàng)建控件時 通常你需要將ByVal發(fā)送器作為System Object參數(shù) 這意味著將這兩者都包含其中
有些程序員在創(chuàng)建事件處理器的時候會出現(xiàn)一個錯誤 即沒有檢查傳入控件的類型 發(fā)送器對象可能包含多選擇 而如果未對事件處理器進行事件處理類型的設(shè)置 那么你就會面臨更多的選擇 我們的示例代碼一開始就檢查了傳入控件對象的類型 這樣以來發(fā)送器就不會像下面所展示的代碼一樣 ?Private Sub btnTest _Click() Handles btnTest Click Create a link Dim NewButton As Button = New Button() Add some properties to it NewButton Text = DateTime Now ToLongTimeString() Set the click event handler AddHandler NewButton Click AddressOf NewLink_Click Place the button on the form lstLinks Controls Add(NewButton)End Sub
此代碼在FlowLayoutPanel中創(chuàng)建了一個按鈕 大多數(shù)情況下這都能正常運行 除非事件處理器不按照按鈕所示的進行操作 如果你打算服務(wù)多個控件類型 那么每個控件類型都需要一個獨特的處理 你可以使用多事件處理器或者為某些類型提供選擇標準
NewLink_Click()事件處理器照常將傳入發(fā)送器轉(zhuǎn)換成指定類型 在這個示例中則是LinkLabel 該代碼可以訪問LinkLabel屬性并能用其他方式進行互動 在我們的示例中 只顯示了一個能在創(chuàng)建鏈接的時候告知我們的對話框
使用動態(tài)代碼
在運行時創(chuàng)建一個控件是在無法確定應(yīng)用程序功能的時候采取的一種策略 但是動態(tài)創(chuàng)建控件并不適用于所有的情況 有些時候你必須建立可執(zhí)行代碼 雖然你的應(yīng)用程序運行的目的是補償不同極其之間的配置 不同用戶的需求 不同的環(huán)境需求或是其他要求 當應(yīng)用程序所運行的電腦不存在控件 那么通常是需要創(chuàng)建動態(tài)代碼的
幸運的是 NET為我們提供了一系列動態(tài)代碼選項 例如 你可以創(chuàng)建一個可執(zhí)行的能獨立運行的程序或是可以想運行中的程序加載一個DLL然后再執(zhí)行 當你需要演示一個外部任務(wù)的時候可以使用選擇可執(zhí)行 如運行一種腳本——該DLL選項最適合擴大現(xiàn)有的應(yīng)用程序功能
你可以運行來自文件或內(nèi)存的動態(tài)代碼 當你需要不止一次地運行代碼時 可以使用文件 對代碼的檢查可以再次運行外部文件而不需要對其進行二次編譯 當你需要多次演示任務(wù)的時候 如一個安裝請求 那可以使用內(nèi)存圖像
當然我們也可以更改源代碼 例如 你可以使用字符串來建立需要在應(yīng)用程序中直接使用的代碼 如果你需要代碼具有高度靈活性 且代碼本身不是很長時 這一方法的優(yōu)勢就非常顯著 也可以從文件里建立代碼 就如同VS一樣 這一方法最適用于相對穩(wěn)定且不需要復雜編碼的需求 第三種選擇是使用Documentation Object Model來創(chuàng)建代碼并將其作為CodeDom樹型結(jié)構(gòu)的一個系列 該樹型結(jié)構(gòu)包括了CodeCormpileUnits 這就像是用DOM模式創(chuàng)建了一個XML文件
使用動態(tài)創(chuàng)建代碼的最好方式是用示例來檢查一下 例三展示了一個基本 Hello World 示例 該示例用源代碼直接創(chuàng)建了代碼因此你可以看到整個運行以及生成一個外部可執(zhí)行文件的過程
例三 動態(tài)編碼示例 ?Private Sub btnTest _Click() Handles btnTest Click Create a piler Dim Comp As VBCodeProvider = New VBCodeProvider() Define the parameters for the code you want to pile Dim Parms As CompilerParameters = New CompilerParameters) We do want to create an executable rather than a DLL Parms GenerateExecutable = True The piler will create an output assembly called Output Parms OutputAssembly = Output The piler won t treat warnings as errors Parms TreatWarningsAsErrors = False Add any assembly you want to reference Parms ReferencedAssemblies Add( System Windows Forms dll ) Define the code you want to run Dim SampleCode As StringBuilder = New StringBuilder() SampleCode Append( Imports System Windows Forms + vbCrLf) SampleCode Append( Module TestAssembly + vbCrLf) SampleCode Append( Sub Main() + vbCrLf) SampleCode Append( MessageBox Show( + Chr( ) + _ Dynamically Created Code! + _Chr( ) + ) + vbCrLf)SampleCode Append( End Sub + vbCrLf)SampleCode Append( End Module + vbCrLf) Define the code to run Dim Executable As CompilerResults = _ Comp CompileAssemblyFromSource(Parms SampleCode ToString()) Display error messages if there are any If Executable Errors HasErrors ThenFor Each Item As CompilerError In Executable ErrorsMessageBox Show(Item ErrorText)NextElse If there aren t any error messages start the executable Process Start( Output )End IfEnd Sub
一開始你創(chuàng)建了一個使用VBCodeProvider的編譯器Comp 舊一點的 NET版本使用的是不同的方法但是這里所講的是微軟推薦的一個新方法
為了使用編譯器 你必須創(chuàng)建能描述應(yīng)用程序的參數(shù) 這些參數(shù)類似于VS中你創(chuàng)建的參數(shù) 只是現(xiàn)在你可以對它們進行定義 該代碼一開始就將GenerateExecutable設(shè)置為True 這意味著你需要的是一個EXE文件而不是DLL
Parms OutputAssembly屬性包含了輸出文件的名稱 你只需要在想創(chuàng)建文件時提供這一信息即可 而不需要生成可執(zhí)行內(nèi)存了 如果你ixiang生成可執(zhí)行文件的內(nèi)存版本 可以將Parm GenerateInMemory屬性設(shè)置為True
使用Parm TreatWarningsAsErrors屬性來確定如何處理警告信息 默認的設(shè)置會使其為錯誤 這意味著你的應(yīng)用程序可能無法對其進行編譯 大多數(shù)程序員使用默認設(shè)置 盡管他們開發(fā)了程序 但是在開發(fā)完成的程序中卻將其設(shè)置為False
大多數(shù)應(yīng)用程序需要外部DLL以正常運行 當然 你不能創(chuàng)建任意的沒有引用外部DLL的Windows表單程序 通常 你要使用Reference文件夾來完成這一任務(wù) 不過 當你動態(tài)創(chuàng)建代碼的時候可以依賴于Parms ReferencedAssemblies屬性 如下所示 只需添加你要的DLL即可
現(xiàn)在 你已經(jīng)定義了項目 接下來需要為其創(chuàng)建源代碼 如前文所述 你可以依賴于一個外部文件或DOM模式 然后 該示例創(chuàng)建了代碼因此你可以看到整個過程 下面是代碼的原始形式 ?Imports System Windows Forms Module TestAssemblySub Main()MessageBox Show( Dynamically Created Code! )End SubEnd Module
這個簡單的例子顯示了一個對話框 注意vbCrLf的使用 如果你不使用這一方法 那編譯器會發(fā)送給你一個錯誤信息 vbCrLf條目在該代碼中所起的作用與在程序代碼中的作用相同 只是添加的方式不一樣
從這一點老說 你最后會用Comp CompileAsseblyFromSource()方法編譯代碼 當使用DOM模式和文件的時候可以使用這一方法 而在所有三種情況中 編譯器用參數(shù)和源代碼創(chuàng)建了你請求的輸出 該運算的輸出出現(xiàn)在Executable中 是CompilerResults類型
編譯的失敗次數(shù)多于程序員的預(yù)計 無論你是在哪里使用動態(tài)編碼技巧 你必須假設(shè)會出現(xiàn)失敗的情況以及處理失敗的方案 在本例中 代碼尋找的是錯誤并在編譯失敗時將其展示在了信息框中 否則 代碼會依賴于Process Start()方法來啟用可執(zhí)行文件
底線
動態(tài)編碼技巧并不是萬能鑰匙 當你為開發(fā)問題找到了好的靜態(tài)解決方案時 當然也可以使用 但是在我們所列出的情況中沒有可行的靜態(tài)方案 因此要選擇動態(tài)編碼技巧 大多數(shù)情況下 要用動態(tài)編碼技巧解決以下問題
◆ 用戶的環(huán)境會以不可預(yù)見的方式更改時
◆ 無法控制用戶電腦的安裝
◆ 用戶或應(yīng)用程序都添加了你要用控件執(zhí)行的數(shù)據(jù)要素
◆ 應(yīng)用程序必須執(zhí)行很早以前的安裝任務(wù) 且這些任務(wù)與電腦 環(huán)境 網(wǎng)絡(luò)或其他不確定因素聯(lián)系緊密時
◆ 應(yīng)用程序要執(zhí)行了處理級別的任務(wù) 且這些任務(wù)取決于機器連接或其他狀況
lishixinzhi/Article/program/ASP/201311/21812
93條碼和CODE39一樣,起搭段胡始符和結(jié)束符都是*號,你做的條碼掃描不出來的原因,估計和校驗碼有關(guān)。知攔93條碼規(guī)定在數(shù)據(jù)的最后有兩個校驗位C和K,如果你的數(shù)據(jù)里沒有燃彎生成這兩個校驗位,那肯定是無法掃描的。
當前題目:vb點虐
條碼生成 vb條形碼生成
本文路徑:http://m.newbst.com/article28/ddpgecp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、商城網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、微信小程序、外貿(mào)建站、移動網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)