Visual Basic 6.0 (VB6) 程式語言案例學習 (10. 條碼列印程式)
Visual Basic 6.0 (VB6) 程式語言案例學習 (10. 條碼列印程式)¶
10.1 問題¶
隨著科技進步神速,條碼列印已經不再是商家專用,或者需要特殊技巧的一件事情了。透過一般的印表機搭配條碼列印程式就可以輕鬆的列印條碼貼紙,這對於普遍的使用者來說,是一件很好的事情。條碼輸入設備感應越做越好,好一點的設備,無論是正掃反掃側掃都可以判斷正確無誤,這次遇到的問題,是要替光碟資產做條碼歸檔,利用市面上隨處可見的條碼貼紙,一張A4大小的貼紙,就可輕鬆的製作條碼。
10.2 需求¶
表格 10‑1 「條碼列印程式」系統目的分析表
| 版本:1.0 | 要做什麼 | 不要做什麼(不要做不代表不會做) |
|---|---|---|
| 能做什麼 | (第一格:必要項目) | (第二格:次要項目) |
| 可自行編輯要列印的資料。 | 可預覽列印。 | |
| 可將編輯的英文及數字資料轉為條碼。 | ||
| 可調整字級大小。 | ||
| 不能做什麼(不能做代表不需要做) | (第三格:不必要項目) | (第四格:不需要項目) |
| 可讀入Excel檔案。 | 可大量印製。 |
表格 10‑2 「條碼列印程式」系統目標分析表
| 版本: | 重要 | 不重要 |
|---|---|---|
| 優先 | (重) | (急) |
| 可自行編輯要列印的資料。 | 可預覽列印。 | |
| 可將編輯的英文及數字資料轉為條碼。 | 不急迫 | |
| (輕) | (緩) | |
| 可調整字級大小。 | 無。 |
表格 10‑3 「條碼列印程式」系統規格表
| 規格項目 | 規格內容 | 備註 |
|---|---|---|
| 資料輸入 | 以文字檔編輯的方式。 | … |
| 字級大小 | 可設定字級大小。 | … |
| 預覽列印 | 可預覽列印。 | … |
10.3 特色¶
透過小而巧的程式,簡單的操作,就可以列印具有條碼的貼紙。
10.4 使用工具¶
| 語言 | 軟體 |
|---|---|
| MS Visual Basic | MS Visual Basic 6.0、MS Access |
10.5 系統架構¶
其實如何將英文數字轉換為條碼的過程相當簡單,因為隨處可見的條碼字型檔,下載之後就可以使用了,系統只是幫助您將字型檔案載入到系統中,而後將英文及數字使用條碼字型,如此簡單的動作就完成了條碼轉換的工作了。
為求便利,透過文書編輯軟體依照一定的格式,編輯欄位,然後再藉由程式匯入,並利用DataReport的功能,設定要列印的內容。整個程式相當小巧,但對於使用者來說相當方便。
10.6 程式實作¶
程式非常之短,只有101行,筆者每一行都加上註解,因此相當容易了解才是。
'設定所有變數必須宣告才能使用
Option Explicit
'使用GDI32 API載入字型
Private Declare Function AddFontResource Lib "gdi32" Alias "AddFontResourceA" _
(ByVal lpFileName As String) As Long
'使用GDI32 API移除字型
Private Declare Function RemoveFontResource Lib "gdi32" Alias "RemoveFontResourceA" _
(ByVal lpFileName As String) As Long
'載入字型副程式
Private Sub A()
Dim retval As Long
retval = AddFontResource(App.Path & "\A.RES")
If retval = 0 Then
Exit Sub
End If
End Sub
'移除字型副程式
Private Sub B()
Dim retval As Long
retval = RemoveFontResource(App.Path & "\A.RES")
If retval = 0 Then
Exit Sub
End If
End Sub
'按下開啟 List.txt 按鈕事件副程式
Private Sub Command1_Click()
'錯誤處理
On Error GoTo err_Command1_Click:
'宣告檔案代碼變數
Dim intFN As Integer
'宣告資料庫連結字串變數
Dim strCnn As String
'宣告資料庫連結物件
Dim objCnn As ADODB.Connection
'設定資料庫連結字串
strCnn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path & "\db1.mdb" & ";" & _
"Mode=Read|Write|Share Deny None;" & _
"Persist Security Info=False;"
'設定資料庫連結物件
Set objCnn = New ADODB.Connection
'開啟資料庫
objCnn.Open strCnn
'宣告SQL字串
Dim strSQL As String
'宣告資料錄物件
Dim objRst As ADODB.Recordset
'設定SQL查詢字串
strSQL = "Select * From [資料表1]"
'設定資料錄物件
Set objRst = New ADODB.Recordset
'開啟查詢資料表
objRst.Open strSQL, objCnn, adOpenKeyset, adLockOptimistic
'刪除資料表中所有內容
Do Until objRst.EOF
objRst.Delete adAffectCurrent
objRst.Update
objRst.MoveNext
Loop
'宣告讀取文字檔字串
Dim strA As String
'宣告計數器變數
Dim lngI As Long
'計數器歸零
lngI = 0
'自動分配檔案代碼
intFN = FreeFile
'開啟檔案
Open App.Path & "\List.txt" For Input As #intFN
'讀取檔案內容
Do Until EOF(intFN)
'讀取檔案內容
Input #intFN, strA
'計數器累加
lngI = lngI + 1
'當字串大於22時
If Len(strA) > 22 Then
'利用循環計數公式
Select Case ((lngI - 1) Mod 4) + 1
'新增資料到第一張標籤貼紙
Case 1
objRst.AddNew
objRst("A") = Left(strA, 19)
objRst("B") = Mid$(strA, 20, Len(strA) - 19)
objRst("C") = Left(strA, 19)
'新增資料到第二張標籤貼紙
Case 2
objRst("A1") = Left(strA, 19)
objRst("B1") = Mid$(strA, 20, Len(strA) - 19)
objRst("C1") = Left(strA, 19)
'新增資料到第三張標籤貼紙
Case 3
objRst("A2") = Left(strA, 19)
objRst("B2") = Mid$(strA, 20, Len(strA) - 19)
objRst("C2") = Left(strA, 19)
'新增資料到第四張標籤貼紙
Case 4
objRst("A3") = Left(strA, 19)
objRst("B3") = Mid$(strA, 20, Len(strA) - 19)
objRst("C3") = Left(strA, 19)
objRst.Update
End Select
End If
Loop
'更新資料庫
objRst.Update
'關閉檔案
Close #intFN
'設定報表資料來源
Set DataReport1.DataSource = objRst
'設定條碼字型
DataReport1.Sections("Section1").Controls("Text2").Font.Name = "3 of 9 Barcode"
DataReport1.Sections("Section1").Controls("Text5").Font.Name = "3 of 9 Barcode"
DataReport1.Sections("Section1").Controls("Text8").Font.Name = "3 of 9 Barcode"
DataReport1.Sections("Section1").Controls("Text11").Font.Name = "3 of 9 Barcode"
'設定字型大小
DataReport1.Sections("Section1").Controls("Text2").Font.Size = Val(Text2.Text)
DataReport1.Sections("Section1").Controls("Text5").Font.Size = Val(Text2.Text)
DataReport1.Sections("Section1").Controls("Text8").Font.Size = Val(Text2.Text)
DataReport1.Sections("Section1").Controls("Text11").Font.Size = Val(Text2.Text)
'設定字型大小
DataReport1.Sections("Section1").Controls("Text1").Font.Size = Val(Text1.Text)
DataReport1.Sections("Section1").Controls("Text4").Font.Size = Val(Text1.Text)
DataReport1.Sections("Section1").Controls("Text7").Font.Size = Val(Text1.Text)
DataReport1.Sections("Section1").Controls("Text10").Font.Size = Val(Text1.Text)
'設定字型大小
DataReport1.Sections("Section1").Controls("Text3").Font.Size = Val(Text3.Text)
DataReport1.Sections("Section1").Controls("Text6").Font.Size = Val(Text3.Text)
DataReport1.Sections("Section1").Controls("Text9").Font.Size = Val(Text3.Text)
DataReport1.Sections("Section1").Controls("Text12").Font.Size = Val(Text3.Text)
'預覽列印
DataReport1.Show 1
'關閉資料錄
objRst.Close
'釋放資料錄
Set objRst = Nothing
'關閉資料庫
objCnn.Close
'釋放資料庫
Set objCnn = Nothing
'跳離副程式
Exit Sub
'錯誤處理標籤
err_Command1_Click:
'顯示錯誤訊息
MsgBox Err.Description, vbOKOnly, "錯誤"
'結束程式
End
End Sub
'程式初始化載入事件副程式
Private Sub Form_Initialize()
'載入條碼字型
Call A
End Sub
'程式結束事件副程式
Private Sub Form_Terminate()
'移除條碼字型
Call B
End Sub
Step 1:如圖10-1,文字檔List.Txt是條碼文字檔的格式。
圖 10‑1
Step 2:如圖 10-2,是程式執行的畫面。
圖 10‑2
Step 3:如圖 10-3,是預覽條碼的畫面。
圖 10‑3
10.7 修改重點¶
程式過於小巧,也代表著孩有發展的空間,例如:採用Excel匯入資料的方式,就是一個很好的改良模式;或者採用Access資料庫管理,便可增加資產管理的功能。讓這支程式變成元件化,就可以隨意加入其它的應用程式中,讓其他程式也具有列印條碼的能力。
10.8 結論¶
這支程式非常符合使用者的需求,因為使用者以往是透過DOS程式在做列印條碼的工作,而DOS程式的介面相當不好調整,而且無法即時預覽,只有在印列錯誤的時候才知道要手動停止。而今可以再列印之前先預覽,檢查是否有錯誤,在做列印的決定,這對於使用者是相當方便的一件事情。
Lai Tai-Yu (賴岱佑)