第11章 多表單與模組的視窗應用程式 11-1 Visual Basic的方案與專案 11-2 模組化Visual Basic應用程式 11-3 建立多表單的應用程式 11-4 建立多文件介面的應用程式 11-5 執行外部應用程式
11-1 Visual Basic的方案與專案 11-1-1 Visual Basic的專案 11-1-2 Visual Basic的方案
11-1-1 Visual Basic的專案-說明 在本書前建立的主控台或Windows應用程式,都是隸屬於同名方案的Visual Basic專案。如果準備建立大型應用程式,在一個方案下可能需要建立多個專案。 Visual Basic專案是方案中的容器,每一個專案可以建立執行檔(.exe)、動態連結程式庫(.dll)或模組(Modules)等。
11-1-1 Visual Basic的專案- 專案的基礎 Visual Basic專案的資訊是儲存在副檔名為.vbproj的檔案,在專案檔案記錄建立應用程式所需的檔案、資料夾和編譯等相關資訊。請開啟Visual Basic專案,可以在右上角看到「方案總管」視窗,如右圖所示:
11-1-1 Visual Basic的專案- 專案的屬性頁(圖例) 在「方案總管」視窗的專案上執行右鍵快顯功能表的【屬性】指令,可以看到專案的屬性頁。
11-1-1 Visual Basic的專案- 專案的屬性頁(屬性說明) 【應用程式】標籤的常用屬性,如下表所示:
11-1-1 Visual Basic的專案- 專案的種類 在VS Express for Desktop新增專案時提供多種專案範本,可以幫助我們快速建立所需的應用程式,如下表所示: 專案範本 說明 Windows Form應用程式 建立擁有Windows圖形使用介面的應用程式 WPF應用程式 建立Windows Presentation Foundation客戶端應用程式 主控台應用程式 建立在命令提示字元或在MS-DOS執行的命令列應用程式 類別庫 建立可以和其他專案共用的VB類別庫(.dll)
11-1-2 Visual Basic的方案-說明 如果使用VS Express for Desktop建立大型應用程式,除了建立Visual Basic的Windows應用程式外,我們可能需要同時建立多個類別庫,此時就需要在同一個方案建立多個專案來開發應用程式。
11-1-2 Visual Basic的方案- 方案的基礎 方案簡單的說是專案的容器,內含一到多個專案,使用.sln儲存方案的定義。請開啟「程式範例\Ch11\Ch11-1-2」資料夾的Visual Basic專案,可以看到「方案總管」視窗,如右圖所示:
11-1-2 Visual Basic的方案- 建立多專案的方案 VS Express for Desktop在預設情況下,同一個方案只建立一個專案,如果需要在方案新增其他專案,如下圖所示:
11-2 模組化Visual Basic應用程式 11-2-1 新增表單 11-2-2 新增模組 11-2-3 模組等級的範圍 11-2-4 指定啟動表單或模組
11-2-1 新增表單-說明 Visual Basic應用程式如果使用模組化程式設計,在應用程式中的表單、模組和類別等都可以視為是一個個模組。 到目前為止的範例程式都只有單一表單,對於複雜的應用程式,我們可以建立多個表單和新增共用程序與函數的模組。 如果程式需要多個表單使用介面,大部分是指對話方塊。我們可以在Visual Basic專案加入所需表單,預設是以Form2~n.vb依序來命名。
在Visual Basic專案加入新表單的方法有2種,如下所示: 11-2-1 新增表單-在專案加入新表單 在Visual Basic專案加入新表單的方法有2種,如下所示: 在「方案總管」視窗的專案上,執行右鍵快顯功能表的「加入/ Windows Form」命令,就可以新增表單。 在開啟專案後,執行「專案/加入Windows Form」命令來新增表單,本節的程式範例是使用此方式。
11-2-1 新增表單-開啟與關閉新表單 如果Visual Basic專案擁有多個表單,除非將它設為啟動表單,否則Form1表單需要使用程式碼來開啟其他表單,如下所示: Dim f2 As Form2 f2 = New Form2() f2.Show() 程式碼在宣告Form2表單物件變數f2後,使用Show()方法開啟Form2表單。關閉表單是使用Close()方法,如下所示: f2.Close()
11-2-1 新增表單- Visual Basic專案 Visual Basic專案:Ch11-2-1 在Windows應用程式新增第2個表單Form2,只需在Form1按下按鈕,可以開啟或關閉Form2表單,如下圖所示:
11-2-2 新增模組-說明 Visual Basic模組(Modules)是一種參考資料型態,在Visual Basic專案加入模組檔案,預設使用Module1~n.vb命名,通常專案中的模組是用來建立表單共享的程序與函數。 表單Form1.vb是類別(Class)檔案,在表單建立的程序與函數需要使用物件方法來呼叫,但是位在模組宣告的公用(Public)變數或程序與函數,就能夠使用如同Visual Basic內建函數的方式來進行呼叫。
11-2-2 新增模組-模組程式範例 Module Module1 Public Function SearchText(strSource As String, _ strTarget As String, _ start As Integer) As Integer Return InStr(start, strSource, strTarget) End Function Public Function ReplaceText(strSource As String, _ strFind As String, _ strReplace As String) As String Return Replace(strSource, strFind, strReplace) End Module
11-2-2 新增模組- Visual Basic專案 Visual Basic專案:Ch11-2-2 此Windows應用程式是修改自Ch8-3-4的Visual Basic專案,將搜尋取代功能的程式碼建立成SearchText()和ReplaceText()函數,並且改置於Module1.vb模組,如下圖所示:
11-2-3 模組等級的範圍-說明 模組等級範圍可以套用在模組、類別與結構,如果在模組、類別與結構宣告變數、程序與函數,就屬於此等級的範圍。其宣告使用的存取關鍵字,如下所示: Private:宣告成Private的變數、程序與函數,只能在該模組中的程序與函數來存取與呼叫。 Public:如果宣告成Public的變數、程序與函數,可以在整個Visual Basic應用程式中各模組的程序與函數來存取與呼叫。
11-2-3 模組等級的範圍-範例 當使用Dim宣告變數時,沒有使用任何存取關鍵字,預設使用Private範圍。例如:在類別與結構Score新增Sum()方法來計算總分,此時在呼叫時需要指明建立的物件或結構變數hueyan,如下所示: hueyan.Sum() 上述程式碼是呼叫物件或結構的方法。如果是位在模組的程序與函數Sum(),就只需使用名稱來呼叫,如下所示: Sum()
11-2-4 指定啟動表單或模組- 加入主程式 按二下Module1.vb開啟程式碼編輯視窗後,請加上主程式Main(),如下所示: 01: Public Sub Main() 02: Dim f1 As Form1 = New Form1() 03: Application.Run(f1) 04: End Sub 上述Main()主程式的第2列建立Form1表單物件,在第3列開啟表單,因為是執行應用程式,所以使用Application.Run()方法來執行Form1表單物件。
11-2-4 指定啟動表單或模組- 指定啟動為Sub Main Visual Basic專案預設的啟動表單是Form1表單,我們可以將它指定成其他表單或擁有程序Main()主程式的模組。如下圖所示:
11-2-4 指定啟動表單或模組-為 什麼指定啟動為Sub Main 因為當程式需要存取Form1表單的控制項屬性,或呼叫表單物件的方法時,為了方便存取與呼叫,我們只需在模組將表單物件使用Public宣告成全域變數,就可以在其他表單存取此表單物件的成員。 在下一節的範例程式就是使用此技巧,以便能夠在多表單的Form2表單存取Form1表單控制項的屬性值。
11-3 建立多表單的應用程式-說明 在Visual Basic建立多表單的Windows應用程式,其目的通常是為了建立不同的資料輸入介面。例如:建立Windows應用程式的「尋找和取代」功能,在執行後可以顯示表單或對話方塊,用來輸入搜尋和取代字串。 換句話說,除了第10章的預設對話方塊外,我們也可以自行建立表單作為對話方塊用途。表單或對話方塊依照資料輸入方式分為:非強制回應和強制回應表單。
11-3 建立多表單的應用程式- 非強制回應表單(Modeless) 非強制回應表單開啟的表單是一個獨立表單,使用者可以在各表單間移動焦點,其地位是相等的。通常在應用程式的工具視窗,就屬於這種表單,使用者可以自行決定執行哪一個表單的功能。 當在Visual Basic專案加入表單後,表單是使用Show()方法來開啟,如下所示: f2 = New Form2() f2.Show() 上述程式碼在建立表單Form2物件後,使用Show()方法開啟非強制回應表單Form2。
11-3 建立多表單的應用程式- 強制回應表單(Modal) 強制回應表單就是對話方塊,在開啟表單或對話方塊後,使用者需要輸入資料和關閉視窗後,才能繼續執行應用程式。例如:MsgBox()函數的Windows訊息視窗,就屬於這種表單。 在Visual Basic專案加入表單後,表單是使用ShowDialog()方法開啟表單,如下所示: f3 = New Form3() f3.ShowDialog() ' 開啟對話方塊 If f3.DialogResult = DialogResult.OK Then …… End If
11-3 建立多表單的應用程式- Visual Basic專案 Visual Basic專案:Ch11-3 此Windows應用程式是修改自Ch10-5的Visual Basic專案,筆者準備完成記事本的【編輯】功能表,包含搜尋與取代功能,分別使用非強制回應表單和強制回應表單來建立此功能,如下圖所示:
11-4 建立多文件介面的應用程式-說明 「多文件介面」(Multiple-document Interface)不同於上一節的多表單應用程式,它是在父MDI表單,可以同時開啟多個子MDI表單,如下圖所示:
11-4 建立多文件介面的應用程式- 建立父MDI表單 父MDI表單是子MDI表單的容器表單,只需將表單Form1的【IsMDIContainer】屬性設為【True】,就可以將表單Form1建立成父MDI表單。
11-4 建立多文件介面的應用程式- 建立與開啟子MDI表單 子MDI表單是在父MDI表單中顯示的表單,在父表單需要使用程式碼來開啟子MDI表單,使用的是Show()方法,如下所示: Dim fc As Form2 = New Form2() fc.MdiParent = Me fc.Show()
11-4 建立多文件介面的應用程式- 取得擁有焦點的子MDI表單物件 在父MDI表單物件可以使用ActiveMdiChild屬性來取得是哪一個表單物件,如下所示: Dim active As Form2 = Me.ActiveMdiChild If (Not active Is Nothing) Then ……….. End If
11-4 建立多文件介面的應用程式- 子MDI表單取得父MDI表單物件 反過來看,對於作用中的子MDI表單,如果需要呼叫父MDI表單的方法,我們可以使用子MDI表單的MdiParent屬性取得父MDI表單,如下所示: Dim parent As Form1 = Me.MdiParent parent.Search(txtSearch.Text) 上述程式碼取得父MDI表單Form1後,呼叫Search()方法。
11-4 建立多文件介面的應用程式- 排列子MDI表單 在父MDI表單可能開啟多個子MDI表單,此時在父MDI表單的功能表可以新增選項,以便切換不同子表單的排列方式,如下所示: Me.LayoutMdi(MdiLayout.Cascade) 上述程式碼使用LayoutMdi()方法排列子表單,其參數是排列方式的MdiLayout列舉常數。
11-4 建立多文件介面的應用程式- MdiLayout列舉常數
Clipboard.SetDataObject( _ active.txtInput.SelectedText) 11-4 建立多文件介面的應用程式- 貼上剪貼簿 剪貼簿功能可以將子MDI表單的文字方塊內容剪下,然後貼到其他子MDI表單上。Visual Basic剪貼簿處理是Clipboard類別,可以使用SetDataObject()方法存入剪貼簿,如下所示: Clipboard.SetDataObject( _ active.txtInput.SelectedText) 上述程式碼將文字方塊選取的文字內容貼上剪貼簿。
至於取出剪貼簿內容物件是使用GetDataObject()方法,如下所示: 11-4 建立多文件介面的應用程式- 貼上剪貼簿 至於取出剪貼簿內容物件是使用GetDataObject()方法,如下所示: Dim ido As IDataObject = Clipboard.GetDataObject() 程式碼取出剪貼簿內容的IDataObject物件後,我們可以使用If條件檢查物件內容的資料格式,如下所示: If ido.GetDataPresent(DataFormats.Text) Then active.txtInput.SelectedText = _ ido.GetData(DataFormats.Text).ToString() End If
11-4 建立多文件介面的應用程式- Visual Basic專案 Visual Basic專案:Ch11-4 在Windows應用程式建立多文件介面的記事本,除了能夠開啟多個編輯視窗外,還新增文字內容剪下和貼上的剪貼簿功能,如下圖所示:
11-5 執行外部應用程式-說明 Windows作業系統是一種多工的作業系統,可以同時執行多個應用程式,例如:同時執行瀏覽程式Internet Explorer瀏覽網頁或記事本編輯文件。 同樣的,使用Visual Basic建立的應用程式,如果需要,可以在Visual Basic應用程式呼叫其他應用程式,以便同時執行相關工具程式,例如:記事本或小畫家。
11-5 執行外部應用程式-Shell()函數 在Visual Basic程式執行外部應用程式的函數是Shell()函數,如下所示: progID = Shell("C:\Windows\notepad.exe", _ AppWinStyle.NormalFocus) 上述Shell()函數的第1個參數是應用程式的完整路徑字串,可以省略執行檔的附檔名.exe,第2個參數是開啟應用程式視窗的樣式,這是AppWinStyle列舉常數。
11-5 執行外部應用程式- AppWinStyle列舉常數
11-5 執行外部應用程式- Visual Basic專案 Visual Basic專案:Ch11-5 在Windows應用程式建立快速啟動列,可以快速執行所需的應用程式,程式是使用Shell()函數呼叫其他應用程式,設定TopMost屬性,讓程式顯示在最上層,如下圖所示:
End