Skip to main content

Visual Basic .Net (VB.Net) 程式語言案例學習 (10. 個人通訊錄程式)

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

image.png
圖 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之後,有沒有發現功能表全部變成圖示介面,讓人一目了然,簡單易懂又具親和力,姑且不論背後的新增功能,就從介面來看,不但美觀又易懂,藉由圖示就可以知道功能的意義。所以介面設計深深的影響著軟體友善度的高低。

image.png
Lai Tai-Yu (賴岱佑)

Popular posts from this blog

Python 日期與時間的處理

Visual Basic 6.0 (VB6) 程式語言案例學習 (10. 條碼列印程式)

寫作:波蘭文學習之旅:1-1. 波蘭文字母與發音(注音版)

Python 日期與時間的處理

Image

Visual Basic 6.0 (VB6) 程式語言案例學習 (10. 條碼列印程式)

Image

寫作:波蘭文學習之旅:1-1. 波蘭文字母與發音(注音版)

Image

數位影像處理:最佳化處理策略之快速消除扭曲演算法

Image

Visual Basic .Net (VB.Net) 程式語言案例學習 (06. 題庫測驗系統)

Image

用10種程式語言做影像二值化(Image binarization)

Visual Basic 6.0 (VB6) 程式語言案例學習 (04. 人事考勤管理系統)

Image

修復損毀的 SQLite DB 資料庫

Image

Visual Basic 6.0 (VB6) 程式語言案例學習 (07. 收據列印程式)

Image

Visual Basic .Net (VB.Net) 程式語言案例學習 (03. 場地預約系統)

Image