1. 初探Microsoft Visual Basic
本章將為您介紹Visual Basic的環境,並且引導您寫出您的第一個Visual Basic程式,本章同時也會討論Visual Basic的許多重要的概念,例如事件導向程式設計模型。假如您對Visual Basic不陌生,您或許可以跳過這章節,不至造成閱讀後續章節時會有任何問題。然而,本章內文中穿插著一些實用的提示,可以讓您充分利用開發環境,本章同時也介紹了一些Visual Basic 6.0的新特色,所以我建議您先拋開您的Visual Basic經驗,很快的將這章節看完。
整合的開發環境
Visual Basic之所以受到許多程式設計人員所喜愛,其中最主要是因為它的整合開發環境(Integrated Development Environment),或縮寫為IDE。理論來說,您可以使用任何編輯器(包括記事本,Notepad.exe)編輯您的Visual Basic程式,但我從沒見過一位程式設計師會這樣做。事實上,IDE可以在您編寫大的應用程式時支援您所有的需求,包含測試和調整,以及最後產生可執行檔。這些執行檔案是不受執行環境影響的,因此可以被分發到客戶端機器上執行,即使它們沒有安裝Visual Basic。
啟動IDE
啟動Visual Basic有許多種方法,下面列出從Windows中啟動的方法:
不要低估快速啟動Visual Basic IDE的便利性,當您開發COM元件或增益集(add-ins)時,開啟多個執行副本是很平常的事情,您會在工作時經常地作這個動作。
選擇專案型態
第一次執行Visual Basic IDE的時候,Visual Basic會問您想要建立什麼型態的專案,就像圖1-1,在這章中和在本書中很多章節的第一部份一樣,我們只建立一個標準執行檔專案,所以我們只要點選 開啟舊檔 的按鈕,或只按下 Enter 鍵便可以開始建立一個專案,這個專案一旦編譯後便可以直接產生一個獨立的可執行應用程式。
如果您想在下次啟動IDE時避免這一個程序,可以點一下 以後不要再顯示此對話方塊 這個核取方塊。
圖1-1啟動Visual Basic 6的環境時,所顯示的 建立新專案 對話方塊 |
IDE視窗
假如您曾經使用過Visual Basic 5,您那一定很熟悉Visual Basic 6 的IDE,如圖1-2。事實上,Visual Basic 6和Visual Basic 5唯一的不同的就是主要功能表選單多了查詢和圖表兩個選項,而且標準工具上多了兩個圖示。當我們開始瀏覽IDE的選單時,可發現一些其他選項( 編輯、 檢視、專案 與 工具 )中有些是Visual Basic 5所沒有的。但整體的變動其實不大,如果您熟悉Visual Basic 5的開發環境其實就能立刻開始以Visual Basic 6做開發的工作。另一方面,假如您只有用過比Visual Basic5更早的版本,您將會驚訝Visual Basic的工作環境有這麼多的變化。理由之一,現在的IDE是一個多文件介面(MDI)的應用程式。這樣我們可以減少一些不必要的視窗,透過單一視窗完成我們要做的工作。
如果您對單一的文件界面(SDI)工作模式有偏好,您也可以恢復到以前的樣子,只要從 工具 功能表內選擇 選項 功能,再點一下 進階 標籤,然後點選 使用SDI開發環境 核取方塊就可以使用SDI開發環境了。
圖1-2 開啟許多視窗的Visual Basic 6環境 |
最後,如果您第一次看到Visual Basic,確實會被這許多選單指令、工具列和主IDE視窗搞混。讓我們迅速地回顧每個項目。我們可以用 檢視 功能表來顯示任何您想看的的視窗,同樣的,許多另外的視窗也可以用如以下段落所描述的快速鍵來打開,甚至可以在主 工具列 中點選啟動視窗。
小秘訣
我們可以按下 F7 功能鍵快速的顯示一個表單或設計師的程式碼視窗,當您現在正在使用程式碼視窗時,按下 Shift+F7 可以開啟相關的表單或是其他的設計師。
小秘訣
沒有任何的功能表指令或工具列圖示可以讓您刪除即時視窗中的內容,最快的方法就是按下 Ctrl+A 選擇整個內容然後按下 Delete 去刪除內容,或是直接打入您想要輸入的內容。
圖1-3 資料檢視視窗讓您可以用互動交談的方式在SQL Server中建立新的View物件。 |
功能表
在本書中詳細的解說每一個功能表指令是沒有必要的,因為有許多指令關聯到一些Visual Basic進階功能。但是對最上層的所有功能表做個瀏覽是很有必要的這樣,當您需要用到某個功能時您會比較好找它。
圖1-4 只有當我們在作一個查詢或是編輯一個SQL Server的View物件時 圖表 功能表才會啟動。 |
工具列
Visual Basic的標準工具列包含了許多一般的指令,如 開啟舊專案、儲存專案 、開始 執行程式和許多時常會開啟的視窗。另外還有三個工具列,分別為偵錯、編輯、和表單編輯器。在標準工具列上按右滑鼠鍵,就會出現一個子選單,您就可以選一個工具列來使用。您也可以用 檢視 功能表中 工具列 功能指令來選擇工具列。
所有的工具列都可以停駐在IDE視窗的上緣部份,或者也可以讓它在開發環境中任意的放置,就像圖1-5。在浮動工具列的標題上按兩下可以將之停駐,而在停駐工具列最左邊的垂直長條上按兩下,就可以使之浮動。如果您想知道工具列上的圖示所代表的特殊意義,您可以將滑鼠指標指到圖示上停留幾秒,就會有工具提示顯示出來告訴您這個工具的名稱。
圖1-5 Visual Basic 6 有四種工具列,每一個都可以分別的用停駐或任意放置。 |
偵錯工具列包含許多在 偵錯 功能表中的指令,編輯工具列在當您寫程式和設定中斷點及書籤時非常有用,表單編輯器工具列包含一些 格式 功能表中在排列控制項在表單上的位置比較有用到的指令。
加上一些額外的工具列是蠻浪費桌面空間的,但如果您的螢幕的解析度用的比較大的話,對您來說就不是問題了。
小秘訣
編輯工具列是很特別的,因為它包含的兩個指令不能透過功能表指令來執行-一個是 使程式行變成註解 另一個是 使註解還原為程式 ,在您測試您程式時這是非常有用的(請看圖1-5中的執行程序都用 使程式行變成註解 ) 成為註解了,基於這個理由,或許您會想將編輯工具列設定在IDE上方便使用。
我們可以自訂Visual Basic現有的工具列甚至於可以做一個新的工具列。如圖1-6,事實上做一個完全新的工具列是非常容易的:
有一些命令可以考慮將他們包含到一個您的自訂工具列;因為他們時常用到,但沒有任何的相關的快速鍵:
工具箱
工具箱通常是您第一個熟悉的視窗,因為當您在寫程式時它讓您視覺化的作出使用者介面。較特別的是工具箱包含了所有的內含控制項的圖示-也就是說所有的控制項會在Visual Basic的執行階段被包含進去。
如果您曾在前一版本的Visual Basic中寫過程式,您應該知道所有在工具箱中的控制項特性,如果您沒有寫過,在您看下列的簡述時參考圖1-7。
圖1-7 Visual Basic 6工具箱和內含控制項。 |
從以上的簡述中,您看見並非全部的內含控制項都同樣的重要。一些控制項,例如TextBox、Label、與CommandButtondj控制項,被實際應用於每一個Visual Basic 應用程式,其他的控制項,例如說:DriveListBox、DirListBox和FileListBox控制項,實際上是有新的替代控制項可供使用。同樣的,您不會將Data控制項用在需要利用ADO資料來源的應用程式中。
您的第一個VISUAL BASIC程式
Visual Basic讓您只要將控制項拖曳至表單上並撰寫當控制項發生某個事件時需執行的程式碼,就可以建立完整且能夠作業的Windows應用程式。例如,您可以撰寫當表單載入或解除載入時或當使用者改變表單大小時便會執行的程式碼。同樣的,您也可以撰寫當使用者在控制項上按一下或者當控制項取得輸入駐點輸入文字時會執行的程式碼。
這種程式設計的範例也就是所謂的「事件導向程式設計」,因為您的應用程式是由數個事件程序所組成的,這些事件程序根據執行期間發生的順序來執行。一般而言當程式在建構之下時,無法預見執行的順序。此程式設計模型可以與以往使用的程序方法相比。
本段將快速回顧事件導向模型並使用一個範例應用程式來介紹Visual Basic的控制項,及其屬性、方法和事件。這個範例應用程式非常的簡單,只要使用者輸入矩形的長和寬,此應用程式便會計算出矩形的周長和面積並顯示結果。如同本書中列示的程式碼範例和程式,本書隨附的CD內也有此應用程式。
將控制項新增至表單上
接下來便開始實際的練習。開啟 Visual Basic IDE ,選擇 標準執行檔 專案,則在工作區中央會顯示一個空白的表單。更精確的說,您目前是在 表單設計 的模式中,在此模式之下您可以設定應用程式主視窗的外觀。如果您需要,您也可以使用另一個設計(例如UserControl和UserDocument設計工具)來建立其他的表單;在本書的其他章節中會詳細說明這些設計工具。
Visual Basic語言的優點之一便是程式設計者可以設計應用程式,不用離開現有的環境便可以測試應用程式。但您應該注意設計和測試程式是兩個不同的工作。在 設計階段 中,您可以建立表單及其他可以看見的物件、設定物件的屬性並控制事件程序程式碼;在 執行階段 中,您可以看到程式設計的效果-您在螢幕上所見的效果便是使用者所見的效果。在執行階段中,您無法叫用表單設計工具,而且對於在設計階段中所撰寫的程式碼的修改能力有限。例如,您可以修改現有的敘述並新增新的敘述,但您無法加入新的程序、表單、或控制項。另一方面,在執行階段時您可以使用一些設計階段中無法使用的診斷工具,因為診斷工具在這種情況下是沒有意義的(例如Locals、Watches、和Call Stack視窗)。
若要在表單上建立一或多個控制項,先在 工具箱 視窗中選擇控制項類型,在表單上按一下,拖曳滑鼠直到畫出您要的控制項大小和形狀為止(並非所有的控制項都可以改變大小,例如Timer控制項只能讓您拖曳,但當您放開滑鼠左鍵時便會還原至原始的大小和形狀)。另一種在表單上建立控制項的方法是:在 工具箱 內連接兩下控制項圖示,這個動作會在表單的中央建立該控制項。不管您使用哪一種方法,您都可以使用滑鼠搬移控制項並改變它的大小。
小秘訣
如果您要建立多個相同類型的控制項,您可以依照下列三個步驟:第一,按住Ctrl鍵不放並同時在 工具箱 視窗中按一下控制項圖示;第二,在表單上按住滑鼠左鍵並拖曳滑鼠,以畫出多個控制項。;第三,當您完成控制項的建立後,按一下Esc鍵或按一下 工具箱 左上角的 Pointer 圖示。
若要完成矩形的範例應用程式,我們需要4個TextBox控制項-兩個輸入矩形的長和寬,兩個顯示周長和面積的結果,請參閱圖1-8。即使由操作的觀點而言並不嚴格要求一定需要Label控制項,但這此範例中我們還是需要4個Label控制項來說明每一個TextBox控制項的功用。最後我們新增一個名為 Evaluate 的CommandButton控制項,此控制項可以啟動計算並顯示結果。
將這些控制項放置在表單上,並依照圖1-8來搬移控制項並調整控制項的大小。不要太擔心控制項是否有對齊,因為您可以使用滑與或是 格式 功能表內的命令來搬移控制項並改變其大小。
圖1-8 設計階段中的Rectangle Demo表單及控制項 |
設定控制項屬性
每一個控制項都有許多屬性,這些屬性定義了控制項的行為和外觀。例如,Label控制項的 Caption屬性便控制了控制項上的字串的顯示外觀,BorderStyle 屬性則會影響控制項的框線格式。TextBox控制項最重要的屬性是 Text,此屬性控制顯示在控制項內的字串,並允許使用者編輯該字串。
在任何的情況下,您只要在表單設計工具中選擇一個控制項,再按下F4以顯示[屬性]視窗,您便可以修改控制項的屬性。您可以捲動 屬性 視窗直到您看到您要設定的屬性為止,接著您便可以選擇該屬性並輸入新值。
使用上述的方法將範例串的4個Label控制項的 Caption 屬性分別設定為 &Width、&Height、&Perimeter 和 &Area。請注意所輸入的&符號並不會在控制項上顯示,&符號會讓此符號後的第一個字母加上底線,而加上&符號的目的便是為控制項建立快速鍵。當控制項設有快速鍵時,使用者只要按下Alt+ x鍵的組合便可以快速的使用該控制項,就如同您在大部份的Windows應用程式中所做的動作一樣。記住只有控制項的 Caption 屬性可以用來建立快速鍵,而可以設定快速鍵的控制項有Label、Frame、CommandButton、OptionButton、和CheckBox。
小秘訣
有一個很方便但文件上並沒有記載上技術可以快速的選擇控制項的屬性;您只要選擇表單上的控制項並按下Ctrl+Shift+ x鍵即可,在此x是指屬性名稱的第一個字母。例如,選擇Label控制項,再按下Ctrl+Shift+C便可以在一個動作中同時顯示 屬性 視窗並選擇了Caption屬性。再按下Ctrl+Shift+C則會選擇下一個名稱以C開頭的控制項。
記住只要您選擇了第一個Label控制項的 Caption 屬性,則當您按一下其他控制項時此屬性便會保持在選擇的狀態下。您可以利用這個特性將CommandButton控制項的 Caption 屬性設定為 &Evaluate,將Form本身的 Caption 屬性設定為 Rectangle Demo,如此便不用每一次都要在 屬性 視窗中選擇 Caption 屬性。注意表單標題內的&號並沒有任何特殊的意義。
接下來我們要使用 Font 屬性變更控制項的字型屬性。您可以逐一的為每個控制項變更屬性,您也可以使用更簡單的方法:就是同時選擇多個您要設定的控制項,如此只要一個動作便可以修改這些控制項的屬性。若要選擇多個控制項,您可以在按一下控制項的同時按住Shift或Ctrl鍵不放,或者您也可以拖曳出一個選框來框住您要選擇的物件(這個技術也稱為框選控制項)。
小秘訣
選擇表單上所有的物件有一個快速的方法,就是按一下表單上任何一個地方,並按下Ctrl+A組合鍵。如果要在取消選擇其中某些物件,您可以在按一下這些物件的同時按下Shift或Ctrl鍵。記住這個快速的方法並不會選擇包含在其他控制項內的控制項。
當您選擇多個控制項並按下F4鍵時,則 屬性 視窗中只會顯示所有被選擇控制項共有的屬性。任何控制項都有的屬性包括有 Left、Top、Width 和 Height。如果您選擇了一些可顯示字串的控制項,例如在我們Rectangle範例表單中的TextBox、Label、和CommandButton控制項,Font 屬性仍可以使用而且已被選擇了。當您在 屬性 視窗內的 Font 屬性內連按兩下,則會顯示 字型 對話方塊。我們將字型設定為Tahoma並將字型大小設定為11。
小秘訣
如果您要將一個控制項的多個屬性複製到一或多個控制項上,您可以選擇您要複製其屬性的控制項,按下Shift鍵並選擇其他的控制項,按下F4以開啟 屬性 視窗,在您要複製的屬性名稱上連按三下。記住您必須按一下左邊的屬性名稱,而非右邊的數值儲存格。當您執行這個動作後,則您在來源控制項連按三下的屬性將會複製到所有其他被選擇的控制項。這個技術並非適用在 屬性 視窗內所有的屬性上。
最後,我們必須清除這4個TextBox控制項的 Text 屬性,如此當此程式開啟執行時使用者可以看到控制的文字輸入框。當您選擇兩個以上的TextBox控制項時,Text 屬性並不會出現在 屬性 視窗中。因此,您必須個別將每一個TextBox控制項的 Text 屬性設定為空字串。坦誠來說,我並不知道為什麼這個屬性對於上述的規則而言是例外。所有這些操作的結果請參閱圖1-9。
圖1-9 設計階段中的Rectangle Demo,在設定控制項的屬性之後 |
小秘訣
當由 工具箱 中建立一個控制項後,它的 Font 屬性則反映其父表單的字型。因此,在您將控制項放置在表單之前您可以變更表單的 Font 屬性,如此便可以避免一一的變更字型的設定。
命名控制項
每一個控制項都有且對Visual Basic程式設計師而言非常重要的屬性便是 Name 屬性,此屬性可以在程式碼之中識別出控制項的字串。此屬性不能是空白字串,而且表單上的控制項不能有相同的名稱。此屬性有一個未被直接證實的特點,就是此屬性在 屬性 視窗中顯示為(Name),在此括號的用途是將此屬性移到屬性清單的第一個位置上。
當您建立一個控制項後,Visual Basic會指派給此控制項一個預設的名稱。例如,您在表單上所建立的第一個TextBox控制項便命名為Text1,第二個TextBox控制項則命名為Text2,以此類推。同樣的,第一個Label控制項命名為Label1,第一個CommandButton控制項命名為Command1。這個預設的命名慣例讓您在每次在建控制項時,免於為每一個控制項取一個新的且獨一無二的名稱。記住,Label和CommandButton控制項的 Caption 屬性,和TextBox控制項的 Text 屬性,一開始會反映控制項的 Name 屬性,但這兩個屬性是互不相關的。事實上,您剛剛就修改了Rectangle Demo表單的 Caption 和 Text 屬性,卻沒有影響到它們的 Name 屬性。
因為 Name 屬性可以在程式碼中識別出控制項,所以最好能修改此屬性讓它能夠表達出控制項的意義。這一點與為您的變數選擇一個有意義的名稱是一樣的重要。就某種意義而言,表單上大部份的控制項就是內容可以直接由使用者輸入的特殊變數。
Microsoft建議您永遠使用為同一個類別內所有的控制項使用相同的三個字母做為名稱的字首。控制項的類別及其建議的字首如表1-1:
控制項 | 類別字首 | 控制項 | 類別字首 |
---|---|---|---|
CommandButton | cmd | Data | dat |
TextBox | txt | HscrollBar | hsb |
Label | lbl | VscrollBar | vsb |
PictureBox | pic | DriveListBox | drv |
OptionButton | opt | DirListBox | dir |
CheckBox | chk | FileListBox | fil |
ComboBox | cbo | Line | lin |
ListBox | lst | Shape | shp |
Timer | tmr | OLE | ole |
Frame | fra | Form | frm |
表1-1 表單及其控制項的標準三個字母的字首 |
例如,您應該將TextBox控制項的名稱字首設定為txt,Label控制項的名稱字首設定為lbl,CommandButton控制項的名稱字首設定為cmd.。表單也應該遵循此原則,表單的名稱字首應該設定為 frm。此原則很有用,因為它可以讓您由控制項的名稱推論出此控制項的類型和意義。本書嚴守此命名原則,特別是在程式碼很複雜的範例中。
在我們的範例中,我們將Text1到Text4的控制項名稱重新命名為txtWidth、txtHeight、txtPerimeter、和txtArea。Command1控制項重新命名為cmdEvaluate,將Label1到Label4控制項分別重新命名為lblWidth、lblHeight、lblPerimeter、和lblArea。然而,Label控制項在程式碼中很少被參照,因此大部份的時候不修改它們的名稱也不會影響到程式碼的可讀性。
搬移控制項及改變大小
您或許無法第一次就將控制項放置在表單上您想要的位置上,通常您要嘗試很多次才能滿意表單的整體外觀。好在IDE提供了許多方法可以很輕鬆的修改控制項的位置和大小。
小秘訣
ComboBox控制項很特別,因為它的高度是由系統根據它的 Font 屬性所決定的。因此,如果您在同一張表單上有一個ComboBox和單行TextBox控制項,您應該使用上述的技術重新調整TextBox控制項的大小,以符合表單中ComboBox控制項的高度,讓您的表單有一致的外觀。
設定定位點順序
在Windows的標準命令中,使用者可以按下Tab鍵以邏輯的順序在視窗中所有的欄位間依序切換;這種邏輯順序也就是定位點順序。在Visual Basic中若要設定定位點的順序,只要為所有可以取得輸入駐點的控制項的 TabIndex 屬性設定適當的值即可。將表單顯示時就取得駐點的控制項設定為0,其他的控制項依序增加數值。在我們Rectangle範例應用程式中,您應該將txtWidth控制項的 TabIndex 屬性設定為0,txtHeight控制項的 TabIndex 屬性設定為1,以此類推。
但先等一等,因為您還需要知道更多定位點順序設定的細節。即使Label控制項永遠不會取得駐點,但它們仍有 TabIndex 屬性,這是為什麼?
我們先前曾提到過,TextBox控制項-或者其他沒有Caption 屬性的控制項-無法直接設定快速鍵,這表示您無法使用Alt+x組合鍵來啟動這類的控制項。在我們的Rectangle範例中,我們經由在每一個TextBox控制項放放置一個Label控制項克服了這個限制。將Label控制項靠近另一個控制項並不會自動讓此控制項擁有快速鍵的功能,為了讓Label控制項將它的快速鍵功能「借給」表單上另一個控制項,您必須讓Label的 TabIndex 屬性比其下方的TextBox控制項的 TabIndex 屬性少1。
在我們Rectangle範例應用程式中,這表示應該依照以下的方式設定 TabIndex 屬性:lblWidth為0,txtWidth為1,lblHeight為2,txtHeight為3,cmdEvaluate為4,lblPerimeter為5,txtPerimeter為6,lblArea為7,txtArea為8。
如果您的表單有數十個甚至是數百個控制項時,為每一個控制項設定正確的 TabIndex 屬性是一件很麻煩的事。有基於此,有些軟體協力廠商便開發了一些增益集幫助您解決這方面的問題;例如在每一個控制項上按一下,或是分析表單上所有控制項的相對位置等方式來設定定位點順序。雖然這些增益集是程式設計師的救星,但在Visual Basic中也有一些技巧讓程式設計師能花費相對較少的精力來設定定位點順序:
小秘訣
Visual Basic 5和Visual Basic 6也提供一個增益集讓您能安排表單中所有控制項的 TabIndex 屬性。此增益集是以來源程式碼的格式提供,位於Samples\CompTool \ AddIns子目錄的TabOrder.vbp專案中。若要使用此增益集,您必須手動編譯和安裝此增益集。此工具讓您在安排有許多控制項表單的定位點順序時能節省許多時間。
現在我們已經完成了一個專案,我們要將此專案儲存。選擇 檔案 功能表中的 Save Project ,或是按一下工具列上的磁片圖示。Visual Basic會要求您設定表單檔案的名稱和專案檔案的名稱;兩個名稱都設定為Rectangle。
您會發現您現在有兩個檔案,Rectangle.frm和Rectangle.vbp。
加入程式碼
到目前為止,您已經為您的程式建立了介面,也建立了一個可以執行的應用程式(按下F5執行此應用程式以確定它真的可以執行),但您還沒有一個有用的應用程式-因為您尚未為應用程式加入程式碼。更精確一點來說,您必須為cmdEvaluate控制項的 Click 事件內加入一些程式碼。當使用者按一下Evaluate鍵或是其快速鍵(在本例中是Alt+E組合鍵),則會啟動此事件。
若要在 Click 事件內寫入程式碼,只要選擇cmdEvaluate控制項再按下F7鍵,或是以右鍵按一下控制項再選擇快速功能表上的 檢視程式碼 命令;或者您也可以用滑鼠的左鍵在控制項上連按二下。上述的方式都可以開啟程式碼編輯視窗,並在下列這兩行程式碼之間會有閃動的游標:
Private Sub cmdEvaluate_Click() End Sub
Visual Basic已經為您準備了 Click 事件程序的範本,您必須在 Sub 和 End Sub 敘述之間加入一至多行的程式碼。在這個簡單的程式中,您需要使用txtWidth和txtHeight控制項內的數值計算出矩形的周長和面積,並分別在txtPerimeter和txtArea控制項中顯示結果:
Private Sub cmdEvaluate_Click() 'Declare two floating point variables. Dim reWidth As Double,reHeight As Double 'Extract values from input TextBox controls. reWidth = CDbl(txtWidth.Text) reHeight = CDbl(txtHeight.Text) 'Evaluate results and assign to output text boxes. txtPerimeter.Text = CStr((reWidth + reHeight) * 2) txtArea.Text = CStr(reWidth * reHeight) End Sub
小秘訣
許多程式設計師,特別是對QuickBasic語言非常有經驗的設計師,習慣擷取 Val 函數字串中的數值。在大部份的情況下,CDbl 或 CSng 型別轉換函數是較好的選擇,因為這些函數是區域感知的,而且這些函數能將使用逗號(而非句號)做為小數點符號的國家內的數值正確的轉譯。更重要的一點,CDbl 或 CSng 函數會忽略分隔字元和貨幣符號(如$1,234),而 Val 函數不能。
記住您應該永遠使用 Dim 敘述宣告您要使用的變數,如此您便可以將這些變數指定為最適合的資料類型。如果您不這樣做,Visual Basic會將它們預設為Variant資料類型。這種資料類型在本範例中是沒有問題,但如果您將變數設定為更適當的類型,則會讓應用程式執行起來更好更快。此外您應該在程式碼模組的起始處加入 Option Explicit 敘述,讓Visual Basic自動阻止使用在程式碼中未經宣告的變數。經由這一個動作,您便可以在未來開發階段中避免掉很多問題。
程式的執行和偵錯
現在您已經準備好執行這個範例程式。執行此程式的方法有很多種:您可以使用 開始 功能表上的 執行 功能、按一下工具列上的執行圖示、或是按下F5鍵。在您執行了上述方法中的一個後,您會看到表單設計工具不見了,取而代之的是真正的表單(並不一定在相同的螢幕位置上出現)。您可以在左方的TextBox控制項內輸入數值並按下Evaluate鈕(或按下Alt+E組合鍵),便可以在右方的控制項中看到計算出的周長和面積結果。當您完成後,只要關閉它的主表單(也是唯一的表單)便可以結束此程式。
注意
您也可以執行 執行 功能表的 結束 命令來停止任何執行中的Visual Basic程式,但這並不是一個好方法,因為它會讓一些與表單相關的事件-也就是 QueryUnload 和 Unload 事件-無法啟動。在大部份的情況下,在這些事件程序包含一般稱做Clean-Up的程式碼敘述,這些敘述會關閉資料庫或是刪除暫時檔。如果您突然停止程式的執行,則這些程式碼便無法被執行。因此,只有在必要的時候才使用 結束 命令。
此程式非常的簡單,因此您幾乎不用測試和偵錯;當然這在實際的應用程式中是不對的-所有的程式都需要測試及偵錯,這可能也是程式設計師工作中最敏感(通常也是最沉悶)的部份。Visual Basic無法讓您避免掉這個討厭的工作,但至少它提供了許多工具可以讓您快速的完成這個工作。
若要在執行中看到一些Visual Basic偵錯工具,當程式在設計模式中時,您可以在 Click 事件程序的第一行中加入中斷點。您只要將游標到適當的指令行,再選擇 偵錯 功能表的 切換中斷點 命令,或是按下F9,就可以設定中斷點。在程式碼編輯視窗左邊界的灰色垂直長條上以左鍵按一下,便可以設定或刪除中斷點。在所有的情況下,中斷點設定的哪一行會以紅色醒目顯示。
在 Click 事件程序的起始處設定中斷點後,按下F5便可以再次執行程式,在Width和Height欄位輸入一些數值,再按一下Evaluate鈕。您會看到Visual Basic進入中斷模式中,您可以隨意執行一些動作讓您更能了解實際的作業:
圖1-10 中斷模式中的Rectangle Demo程式,其數個偵錯工具 |
改良範例程式
雖然我們第一個Visual Basic專案,Rectangle.vbp,只是一個簡單的程式,但這並不表示我們就不用改良這個程式,並將這個程式變成一個完整、強固的應用程式。
第一個改良的方非常的簡單。由於txtPerimeter和txtArea控制項是用於顯示計算的結果,因此不能讓使用者編輯這兩個控制項的內容;只要將這兩個控制項的 Locked 屬性設定為True,便可以將控制項設定為唯讀(建議:只要選擇這兩個控制項,按下F4,便可以一次修改屬性)。有些程式設計師較喜歡使用Label控制項顯示表單上的結果,但使用唯讀的TextBox控制項有一個好處:使用者可以將它們的內容複製到剪貼簿並將這些內容貼在另一個應用程式中。
第二個改進的方法便是增加應用程式的一致性和使用性。我們假設您的使用者使用Rectangle程式計算出矩形的周長和面積,並寫下計算的結果,再輸入新的寬或高(或者兩者)的數值。但如果在您的使用者按下Evaluate鈕時突然電話響了,使用者接起電話後便開始聊起天了。當他掛上電話後,表單上所顯示的結果看似真正,其實卻是錯誤的答案。您要如何確定這些數值是您要計算的數值呢?解決的方法很簡單-只要使用者修改了txtWidth或txtHeight TextBox控制項的內容,則結果欄位的內容會被清除。如果您要在Visual Basic中完成這個工作,只要在每一個來源控制項的 Change 事件程序中各加入一段敘述。由於 Change 是TextBox控制項預設的事件-就如同 Click 是CommandButtons控制項的預設事件一樣,因此您只要在表單設計工具中連按兩下txtWidth和txtHeight控制項,Visual Basic便會為對應的事件程序建立範本。以下是您要加入程序內的的程式碼:
Private Sub txtWidth_Change() txtPerimeter.Text = "" txtArea.Text = "" End Sub Private Sub txtHeight_Change() txtPerimeter.Text = "" txtArea.Text = "" End Sub
注意您不需要在 txtHeight 控制的 Change 事件中重新輸入此敘述,只要在控制項上連按兩下滑鼠以建立 Sub ... End Sub 範本,再複製及貼上 txtWidth_Click 程序內的程式碼。當您完成之後,再按F5建執行此程式以檢視此程式是否如您預期般的運作。
我所設定的下一個改進方法的目的是增加程式的強固性。若想要明白我指的是什麼,請執行Rectangle專案,並在不輸入長和寬數值的狀況下按下Evaluate鈕;當程式嘗試擷取txtWidth控制項的數值是,程式發生了Type Mismatch錯誤。如果這在日常實際的作業中,編譯的應用程式如果有這一類的錯誤通常會導致應用程式突然的結束,當然這是不被接受的。所有的錯誤必須被找出並以適當的方式加以處理。例如,向使用者顯示問題何在及處理的方式。最簡單的方法便是在 cmdEvaluate_Click 程序內建立錯誤處理常式,如下(您要加入的程式碼是以粗體顯示的程式碼):
Private Sub cmdEvaluate_Click() 'Declare two floating point variables. Dim reWidth As Double,reHeight As Double On Error GoTo WrongValues 'Extract values from input textbox controls. reWidth = CDbl(txtWidth.Text) reHeight = CDbl(txtHeight.Text) Ensure that they are positive values. If reWidth <= 0 Or reHeight <= 0 Then GoTo WrongValues 'Evaluate results and assign to output text boxes. txtPerimeter.Text = CStr((reWidth + reHeight) * 2) txtArea.Text = CStr(reWidth * reHeight) Exit Sub WrongValues: MsgBox isPlease enter valid Width and Height values",vbExclamation End Sub
注意我們已經加入 Exit Sub 敘述以防止 MsgBox 敘述在正常的執行流程中被錯誤的執行。若要了解 On Error 敘述的運作方式,在此程序的第一行設定中斷點,執行此應用程式,並按F8鍵以檢視當TextBox控制項內有空的或無效的字串時會發生什麼事。
準備,編譯,執行!
Visual Basic是非常有生產力的程式語言,因為它可以讓您在可控制的環境內建立和測試應用程式,而不需要先產生一個編譯的可執行程式。這是有可能的,因為Visual Basic將來源程式碼轉換成成虛擬碼,再解釋它。虛擬碼是一種居中的語言,由於它無法直接由CPU執行,因此它比真正的原始編譯程式碼慢。另一方面,將來源程式碼轉換成虛擬碼只佔了傳遞編譯應用程式所需的時間中的一段很短暫的時間;這是一個其他語言所未知的龐大生產力。虛擬碼的另一個好處是當程式在環境中執行時,您可以一步一步的執行它,調查變數的值,甚至修改程式碼本身;這種能力其他語言所沒有或是最近才擁有的,例如最新版的Microsoft Visual C++有這種功能。經過比較之後,您應該了解Visual Basic絕對擁有這種功能,無疑的也讓它成為一個成功的語言。
在開發一個程式期間,您可能要建立一個可執行程式(EXE),需要如此做的理由有很多:編譯的程式通常比解譯的程式快,使用者不需要安裝Visual Basic便可以執行您的應用程式,而且您通常不要讓其他的使用者看到您的來源程式碼。Visual Basic讓編譯的過程變得很容易:當您確定您的應用程式已經完成時,您只要執行 檔案 功能表內的 製成projectname 命令即可。
建立一個Rectangle.exe檔案只需數秒,此執行檔不依賴Visual Basic環境,它的執行方式與其他Windows應用程式相同-例如,從 開始 功能表上的 執行 命令執行。但這並不表示您將這個EXE檔案傳給另一個使用者就能預期它可以正常的作業。事件上所有的Visual Basic程式都依賴一些輔助檔案-尤其是MSVBVM60.DLL檔案(Visual Basic執行階段的一部份)-而且不會精確的執行除非所有這類檔案都正確的安裝在目標系統中。
有基於此,您不能因為在您的電腦上或辦公室的每一台電腦上都執行Visual Basic,您就認為每一台Windows系統上都執行Visual Basic(如果您的單位是軟體開發部,就更有可能在您週遭的電腦都安裝了Visual Basic環境)。因此,使用Package和Deployment Wizard執行標準安裝,並在一個乾淨的系統上測試您的應用程式。如果您的職業便是開發軟體,您必須備有一個乾淨的系統,如有可能請只安裝作業系統。如果您是一個獨立開發者,您或許不想買一個完整的系統只是用來測試您的軟體。我發現一個非常簡單且相對上較便宜的方法可以解決這個問題。我使用一台有抽取式硬碟的電腦,所以我可以很輕鬆的在不同系統組態下測試我的應用程式。由於一個乾淨的作業系統只需數百MB的磁碟空間,因此我可以使用一些對於其他系統而言空間不足的舊硬碟。
在我為本章下結論之前,您應該再明白一些細節。編譯的程序並不一定表示您不使用虛擬碼。在Visual Basic的術語中,編譯(Compiling)只是指 建立一個可執行檔 。事實上,您可以編譯成虛擬碼,即使對於使用其他語言的開發者而言它聽起來像是一種矛盾的語法(如圖1-11)。在這種情形下,Visual Basic會建立內嵌有與開發環境所使用的相同虛擬碼的EXE檔案。這也就是為何您常聽到Visual Basic開發者談到「虛擬碼」和「機器碼」編譯是較佳的編譯類型。
圖1-11 您可以在 Project Properties 對話方塊中Compile標籤頁中選擇虛擬碼或是機器碼 |
通常這種虛擬碼編譯的程式執行的速度與在IDE內解譯的程式速度一樣,因此您錯失了編譯程序中最大的好處。但在此有一些您決定建立一個虛擬碼可執行檔的理由:
我們已經由到了Visual Basic IDE之旅的終點了。在本章內,筆者說明了Visual Basic開發的基礎,希望您對於此語言的功能有初步的了解。現在您已經準備好進入下一章了,在下一章中您也可以學習更多的表單及控制項功能,及其屬性、方法和事件的最佳設定方法。