Visual Basic .Net (VB.Net) 程式語言案例學習 (10. 個人通訊錄程式)
Visual Basic .Net (VB.Net) 程式語言案例學習 (10. 個人通訊錄程式)¶
10.1 問題¶
通訊錄的程式其實Microsoft已經有附加在作業系統上了,但由於不是欄位太多,或者是許多欄位用不到,看起來實用性不高,因為沒辦法客制化,相信使用Microsoft通訊錄的朋友應該是少數吧。最常見的解決方案就是使用Microsoft Excel紀錄通訊錄,不但欄位可以自訂,還可以排序跟搜尋,甚至列印成小紙片,可以方便帶在身上。這個問題的需求是筆者的朋友提出的,他希望有個簡單的程式可以紀錄通訊錄,而且越簡單清楚越好,可以一目了然。因此筆者就試著把他的需求分析一下,發現其實通訊錄的基本需求並不複雜,而且也是個很好的練習題。
10.2 需求¶
表格 10‑1 「個人通訊錄程式」系統目的分析表
版本:1.0 | 要做什麼 | 不要做什麼(不要做不代表不會做) |
---|---|---|
能做什麼 | (第一格:必要項目) | (第二格:次要項目) |
利用資料庫將基本資料存入。 | 將資料庫升級至SQL Server,透過網路讓使用者建立基本資料。 | |
畫面要簡單,可以容納所有欄位。 | ||
尋找資料可以用選擇的,或者是用輸入。 | ||
可以存入照片,移除照片。 | ||
輸入電話資料的時候,必須檢查輸入字元,只能輸入數字。 | ||
不能做什麼(不能做代表不需要做) | (第三格:不必要項目) | (第四格:不需要項目) |
設計批次產生基本資料的功能。 | 能夠連結MS Outlook,將資料匯入。 |
表格 10‑2 「個人通訊錄程式」系統目標分析表
版本: | 重要 | 不重要 |
---|---|---|
優先 | (重) | (急) |
畫面要簡單,可以容納所有欄位。 | 利用資料庫將基本資料存入。 | |
輸入電話資料的時候,必須檢查輸入字元,只能輸入數字。 | ||
不急迫 | (輕) | (緩) |
尋找資料可以用選擇的,或者是用輸入。 | 可以存入照片,移除照片。 |
表格 10‑3 「個人通訊錄程式」系統規格表
規格項目 | 規格內容 | 備註 |
---|---|---|
主要功能 | 輸入電話資料的時候,必須檢查輸入字元,只能輸入數字。 | … |
尋找資料可以用選擇的,或者是用輸入。 | ||
可以存入照片,移除照片。 | ||
使用介面 | 畫面要簡單,可以容納所有欄位。 | … |
10.3 特色¶
特點就是透過簡明的畫面,直覺式的操作,方便有效率的個人通訊錄程式。
10.4 使用工具¶
語言 | 軟體 |
---|---|
Visual Basic 2005 | MS Visual Studio 2005 .NET、MS Access |
10.5 系統架構¶
首先藉由模組宣告共用的變數以及資料庫連結物件,接著建立起開關輸入輸出的控制項,也就是使用者介面型態函式,透過這些副程式幫忙設定讀寫文字框以及按鈕顯示跟隱藏,這樣才會方便。其實目前的欄位算是非常的少,因此透過記憶力大概就可以規劃了,可是一般的應用程式介面可就沒有這麼簡單了,例如:進銷存軟體,每一個表單的介面最好都要使用表格紀錄起來各種狀態,這樣才不會出錯。
其次是資料庫的讀寫,這裡比較特別的一點就是影像檔的讀寫,有兩種作法,第一種就是外部儲存,也就是替影像檔案編碼,重新命名並將新的名稱寫入資料欄位中;第二種就是資料庫儲存,直接以二進制檔案寫入資料庫欄位中。哪一種做法比較好呢?其實要看應用,倘若要求速度,那麼外部儲存因為直接讀取檔案,自然速度會快。倘若要求方便管理,那麼一個資料庫就可以容納所有資料,也是蠻方便的。由於影像檔並不會太多,所以我們選擇第二種作法。如果是處理上千張影像檔的話,建議使用SQL Server來管理,筆者有實際經驗,上千至萬張的學生照片,以SQL Server來管理的話是綽綽有餘,不必擔心效能。
最後使用System.Diagnostics.Process.Start方法,來開啟網頁。其實這個方法除了網頁之外,還可以啟動並監視外部程式,包含批次檔案。它會開啟相對應的程式,所以開啟的是文字檔的話,會自動呼叫相對應的程式。再講得更簡單一點,它就有點像是點選開始、執行(R),輸入命令文字,按下Enter鍵。
10.6 程式實作¶
10.6.1 讀出資料的程式碼¶
主要是介紹由資料庫讀出二進制影像的方法。
‘下拉式姓名選擇欄位更動事件 Private Sub cb1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cb1.SelectedIndexChanged ‘狀態文字框顯示目前所選擇的姓名 ts1.Text = "我的通訊錄: " + cb1.SelectedItem Try ‘清除文字框內容 Call formClear() ‘檢查資料庫連結物件狀態,若連接關閉,則資料庫物件關閉 If con.State = ConnectionState.Closed Then con.Close() ‘開啟資料庫連結 con.Open() ‘宣告並建立資料庫命令物件,以姓名為查詢關鍵字 Dim cmd As New OleDbCommand("select * from table1 WHERE name = '" & cb1.SelectedItem & "'", con) ‘宣告資料讀取物件 Dim drdr As OleDbDataReader ‘將命令結果傳送給資料讀取物件 drdr = cmd.ExecuteReader ‘讀第一筆資料 drdr.Read() ‘設定姓名欄文字框 tb1.Text = drdr.Item("name") ‘設定地址欄文字框 tb2.Text = drdr.Item("address") ‘設定電話文字框 tb3.Text = drdr.Item("phone") ‘設定行動電話文字框 tb4.Text = drdr.Item("mobile") ‘設定電子郵件文字框 tb5.Text = drdr.Item("email") ‘設定生日文字框 tb6.Text = drdr.Item("dob") ‘宣告位元組陣列 Dim bt() As Byte ‘宣告記憶體串流物件 Dim ms As MemoryStream ‘將二進位資料讀入位元組陣列 bt = drdr.Item("image") ‘建立新的記憶體串流物件,內容為二進位資料 ms = New MemoryStream(bt) ‘藉由Image.FromStream將串流轉換為影像格式 pb1.Image = Image.FromStream(ms) ‘隱藏欄位設定為姓名 tb8.Text = drdr.Item("name") ‘顯示影像 pb1.Show() ‘取消資料命令物件動作 cmd.Cancel() ‘關閉資料庫連結 con.Close() ‘啟用修改選項 mrec.Enabled = True ‘啟用刪除選項 drec.Enabled = True ‘啟用修改按鈕 mbtn.Enabled = True ‘啟用刪除按鈕 dbtn.Enabled = True ‘例外處理 Catch ex As Exception ‘顯示發生何種錯誤訊息 MsgBox(ex.Message) End Try End Sub
圖 10‑1
如圖10-1可見點選上方的姓名下拉式選單,就會把該列的資料載入基本資料中。
10.6.2 寫入資料的程式碼¶
主要是介紹寫入影像檔到資料庫二進制欄位的方法。
‘宣告檔案串流物件開啟影像暫存檔 Dim fs As New FileStream(Application.StartupPath + "\temp.dat", FileMode.Open) ‘以檔案長度宣告位元組陣列 Dim arbyte(fs.Length) As Byte ‘一次讀取影像檔所有資料到位元組陣列中 fs.Read(arbyte, 0, arbyte.Length) ‘關閉檔案 fs.Close() ‘宣告SQL命令文字,在影像欄位中我們以問號代替二近置資料 Dim st As String = "INSERT INTO Table1(name,address,phone,mobile,email,dob,[image])VALUES('" & tb1.Text & "','" & tb2.Text & "','" & tb3.Text & "','" & tb4.Text & "','" & tb5.Text & "','" & tb6.Text & "', ?)" ‘宣告並建立資料庫命令物件 Dim cmd As New OleDbCommand(st, con) ‘宣告資料庫參數物件 Dim mypar As New OleDbParameter("@picture", OleDbType.LongVarBinary) ‘設定影像位元組陣列的資料到參數物件 mypar.Value = arbyte ‘設定影像位元組陣列長度的資料到參數長度 mypar.Size = arbyte.Length ‘命令物件加入參數 cmd.Parameters.Add(mypar) ‘開啟資料庫連結 con.Open() ‘執行命令 cmd.ExecuteNonQuery() ‘顯示訊息 MsgBox("紀錄成功") ‘刪除影像暫存檔 File.Delete(Application.StartupPath + "\temp.dat")
10.7 修改重點¶
這類的程式最主要的就是客製化,依照個人的需求而設計修改,您可以設計的複雜一些,也可以簡單一些,端看需求而定。無論是增加欄位,或是增加介面,都是可以做的選項。
有一點卻是值得一試的,將資料放在SQL Server上,還記得我們的架構是將資料庫連結物件模組化,所以基本上在這裡修改之後,再將主程式的資料庫相關元件更名就可以了,由於.NET元件很多,因此採用名稱空間規劃,有關資料庫的都放在System.Data,也就是說無論連結單機或是伺服器的元件,都可以在這裡引用的到。因此要將其修改成網路版是相當容易的一件事情。
10.8 結論¶
功能強大未必是好處,有時候簡單清楚明瞭反而有效率。就拿Microsoft Office系列來說吧,MS Office 2003以前都採用選單的方式,功能非常的豐富,但你我皆知,會使用到的功能其實只有幾項,因此微軟還貼心的設計將常用的功能顯示出來,隱藏不常用的功能。可是還是稍嫌複雜,因此到了MS Office 2007之後,有沒有發現功能表全部變成圖示介面,讓人一目了然,簡單易懂又具親和力,姑且不論背後的新增功能,就從介面來看,不但美觀又易懂,藉由圖示就可以知道功能的意義。所以介面設計深深的影響著軟體友善度的高低。
Lai Tai-Yu (賴岱佑)