再說窗體
除窗體設計原理以外,還需考慮應用程式的開始與結束。有一些技巧用於決定應用程式啟動時的外觀。熟悉應用程式卸載時進行的一些處理也很重要。
設定啟動窗體
在預設情況下,應用程式中的第一個窗體被指定為啟動窗體。應用程式開始運作時,此窗體就會被顯示出來(因而最先執行的程式碼是該窗體的Form_Initialize事件中的程式碼)。如果想在應用程式啟動時顯示別的窗體,那麼就得改變啟動窗體。
若要變更啟動窗體,請依照下列步驟執行:
1.從「工程」選單中,選取「工程屬性」。
2.選取「一般」。
3.在「啟動物件」ListBox中,選取要為新啟動窗體的窗體。
4.選取「確定」。
沒有啟動窗體時的啟動
有時候也許要應用程式啟動時不載入任何窗體。例如:可能想先執行裝入資料檔案的程式碼,然後再根據資料檔案的內容決定要顯示幾個不同窗體中的哪一個。要做到這一點,可在標準模組中建立名為Main的子過程,如下面的範例所示。
SubMain()
DimintStatusAsInteger
'呼叫一個函數過程來檢驗使用者狀態。
intStatus=GetUserStatus
'根據狀態顯示某個啟動窗體。
IfintStatus=1Then
frmMain.Show
Else
frmPassWord.Show
EndIf
這個過程必須是一個子過程,且不能在窗體模組內。欲將SubMain流程設為啟動對象,可從“工程”選單中,選取“工程屬性”,再選“一般”,然後從“啟動對象”方塊中選取“SubMain”。
顯示啟動時的快速顯示
如果啟動時有一個較長的執行過程,例如要從資料庫中裝入大量資料或要裝入一些大型點陣圖,這時可能希望在啟動時給出一個快速顯示。快速顯示是一種窗體,它通常顯示的是諸如應用程式名,版權資訊和一個簡單的點陣圖等內容。啟動VisualBasic時所顯示的畫面就是一個快速顯示。
若要顯示快速顯示,需使用SubMain流程作為啟動對象,並以Show方法顯示此窗體:
PRivateSubMain()
'顯示快速顯示。
frmSplash.Show
'在此處新增啟動過程。
……
'顯示主窗體並卸載快速顯示。
frmMain.Show
UnloadfrmSplash
EndSub
當一些啟動例程正在執行時,快速顯示能吸引使用者的注意,造成應用程式裝載很快的錯覺。當這些啟動例程完成以後,可以裝入第一個窗體並使其快速顯示卸載。
對於快速顯示的設計來說,盡量簡單為好。如果使用大量位圖或大量控件,則快速顯示本身裝入將會變慢。
結束應用程式
當所有窗體都已關閉且沒有程式碼正在執行時,事件驅動的應用程式就停止運作。如果最後一個可見窗體關閉時仍有隱藏窗體存在,那麼,應用程式表現為已經結束了(因為沒有可見的窗體),可實際上應用程式仍在繼續運行,直至所有隱藏窗體都關閉為止。之所以出現這種情況,是因為對已卸載窗體的屬性或控制項的任何訪問,都將導致隱含地、不予顯示地載入那個窗體。
避免出現關閉應用程式時的這類問題,最好的方法是確保所有的窗體都已卸載。如果有一個以上窗體,可以使用Forms集合和Unload語句。例如,在主窗體上可以用一個名為cmdQuit的命令按鈕退出程式。如果應用程式只有一個窗體,則Click事件過程可簡單為:
PrivateSubcmdQuit_Click()
UnloadMe
EndSub
如果應用程式使用多窗體,透過把程式碼放入主窗體的Unload事件過程可以卸載這些窗體。可以使用Forms集合確保找到並關閉所有窗體。下列程式碼就是使用窗體集合來卸載所有窗體的:
PrivateSubForm_Unload(CancelAsInteger)
Dimiasinteger
'在窗體集合中循環並卸載每個窗體。
Fori=Forms.Count-1to0Step-1
UnloadForms(i)
Next
EndSub
有一些情況需要不顧現存窗體或物件的狀態而結束應用程式。為此,VisualBasic提供了End語句。
End語句讓應用程式立即結束:在End語句之後的程式碼不會執行,也不會再有事件發生。特別是,VisualBasic將不會執行任何窗體的QueryUnload、Unload或Terminate事件流程。物件的各個參考將被釋放,但如果定義有自己的類,VisualBasic將不會執行由這些類別建立物件的Terminate事件。
除End語句以外,Stop語句可以暫停一個應用程式。然而,Stop語句只能在偵錯時使用,因為它不會釋放物件的參考。
詳細資訊關於Stop語句的信息,請參閱第十三章“調試程式碼和處理錯誤”中的“使用中斷模式”,以及《語言參考》的“Stop語句”。關於窗體集合或釋放物件引用的信息,請參閱第九章「用物件編程」。
在應用程式中使用選單
許多簡單的應用程式只由一個窗體和幾個控制項組成,但透過增加選單可以增強VisualBasic應用程式的功能。這一節將介紹如何在應用程式中建立選單和使用選單。
用選單編輯器建立選單
用選單編輯器可以建立新的選單和選單列、在現有的選單上增加新命令、用自己的命令來替換現有的選單命令以及修改和刪除現有的選單和選單列。
若要顯示選單編輯器,請:
從「工具」功能表上,選取「選單編輯器」。
-或者-
在「工具列」上點選「選單編輯器」按鈕。這就會開啟選單編輯器,如圖6.7所示。
儘管大多數選單控制項屬性可用選單編輯器設置,所有的選單屬性在「屬性」視窗中也都是可用的。選單控制項的兩個最重要的屬性是:
Name-這是程式碼中用來引用選單控制項的名字。
Caption-這是出現在控制項上的文字。
選單編輯器中的其它屬性,包括Index、Checked和NegotiatePosition,在本章稍後介紹。
使用選單編輯器中的列錶框
選單控制列錶框(位於選單編輯器的下部)列出目前窗體的所有選單控制項。當在標題文字方塊中鍵入選單項目時,該項目也會出現在選單控制項列錶框中。從列錶框中選取一個已存在的選單控制項可以編輯該控制項的屬性。
例如,圖6.7顯示典型應用程式中「檔案」選單的各種選單控制項。選單控制項在選單控制項列錶框中的位置決定了該控制項是選單標題、選單項目、子選單標題或子選單項目:
位於列錶框中左側平齊的選單控制項會作為選單標題顯示在選單列中。
列錶框中被縮排過的選單控件,當按一下其前導的選單標題時才會在該選單上顯示。
一個縮排過的選單控件,如果後面還緊跟著再次縮排的一些選單控件,它就成為一個子選單的標題。在子選單標題以下縮排的各個選單控件,就成為該子選單的選單項目。
一個以連字號(-)作為它的Caption屬性的選單控件,作為一個分隔符號出現。分隔符號條可把選單項目分割成若干個邏輯群組。 注意如果選單控制項是選單標題、帶有子選單項目、被複選或無效、或有一個快捷鍵,那麼它就不能作為分隔符號條。
若要在選單編輯器中建立選單控件,請按照下列步驟執行:
1.選取該窗體
2.從「工具」選單中,選取「選單編輯器」。 -或-在「工具列」上點選「選單編輯器」按鈕。
3.在「標題」文字方塊中,為第一個選單標題鍵入希望在功能表列上顯示的文字。如果希望某一字元成為該選單項目的存取鍵,也可以在該字元前面加上一個(&)字元。在選單中,這一字元會自動加上一條底線。
選單標題文字顯示在選單控制項列錶框中。
4.在「名稱」文字方塊中,鍵入將用來在程式碼中引用該選單控制項的名字。請參閱本章後面「選單標題與命名準則」。
5.點選向左或向右箭頭按鈕,可以改變該控制項的縮排等級。
6.如果需要的話,也可以設定控制項的其他屬性。這項工作可以在選單編輯器中做,也可以以後在「屬性」視窗中做。
7.選取「下一個」就可以再建一個選單控制項。 -或者-點擊「插入」可以在現有的控制項之間增加一個選單控制項。也可以點選向上與向下的箭頭按鈕,在現有選單控制項之中移動控制項。
8.如果窗體所有的選單控制項都已創建,選取「確定」可關閉選單編輯器。建立的選單標題將顯示在窗體上。在設計時,按一下選單標題可下拉其對應的選單項目。
分隔選單項
分隔符號條作為選單項目間的一個水平行顯示在選單上。在選單項目很多的選單上,可以使用分隔符號條將各項分割成一些邏輯組。例如VisualBasic的「幫助」選單,使用分隔符號條將其選單項目分成三組,如圖6.8所示。
若要在選單編輯器中建立分隔符號條,請依照下列步驟執行:
1.如果想在一現有選單中增加一個分隔符號條,選取“插入”,在想要分隔開來的選單項目之間插入一個選單控制項。
2.如有必要,按一下右箭頭按鈕使新選單項目縮排到與它要分開的選單項目同級。
3.在「標題」文字方塊中鍵入一個連字符(-)。
4.設定“名稱”屬性。
5.選取“確定”,關閉選單編輯器。
注意雖然分隔符號條是當作選單控制項來建立的,但它們不能回應Click事件,而且也不能被選取。
賦值存取鍵和快捷鍵
透過定義存取鍵和快速鍵可改善鍵盤對選單命令的存取。
存取鍵
訪問鍵允許按下ALT鍵並打入一個指定字元來開啟一個選單。一旦選單打開,透過按下所賦值的字元(存取鍵)可選取控制項。例如,按下ALT E鍵可開啟「編輯」選單,再按P鍵可選取「貼上」選單項目。在選單控制項的標題中,一個指定的存取鍵表現為一個下劃線的字母,如圖6.9所示。
若要在選單編輯器中為選單控制項賦值存取鍵,請依照下列步驟執行:
1.選取要賦值存取鍵的選單項目。
2.在其「標題」方塊中,在要作為存取鍵字元的前面直接鍵入一個(&)字元。
例如,如果圖6.9所示的「編輯」選單被打開,下列Caption屬性設定值回應的對應鍵。
注意選單中不能使用重複的存取鍵。如果多個選單項目使用同一個存取鍵,則該鍵將無法運作。例如,如果C同時是「剪切」和「複製」的存取鍵,那麼,當選取「編輯」功能表且鍵入C時,則「複製」命令將被選,但只有按下ENTER鍵以後,應用程式才會執行該指令。而「剪切」指令根本不會執行。
快速鍵
快捷鍵按下時會立刻執行一個選單項目。可以為頻繁使用的選單項目指定一個快捷鍵,它提供一種鍵盤單步的存取方法,而不是按住ALT鍵、再按選單標題存取字符,然後再按選單項目存取字符的三步驟方法。快速鍵的賦值包括功能鍵與控制鍵的組合,如CTRL F1鍵或CTRL A鍵。它們出現在選單中對應選單項目的右邊,如圖6.10所示。
若要對選單項目賦值快速鍵,請依照下列步驟執行:
1.開啟“選單編輯器”。
2.選取該選單項目。
3.在「快速鍵」組合方塊中選取功能鍵或鍵的組合。
若要刪除快速鍵賦值,應選取清單頂部的「(none)」。
注意快捷鍵將自動出現在選單上;因此,不需要在選單編輯器的「標題」方塊中鍵入CTRL key。
選單標題與命名準則
為了與其它應用程式保持一致,在建立選單時遵循所確立的命名準則是一個好方法。
設定Caption屬性
為選單項目進行標題賦值時,應盡量遵循下列準則:
1.選單中項目名稱應唯一,但不同選單中相似動作項目可重名。
2.項目名稱可以是單字、複合字或多個字。
3.每一個項目名稱都應有一個用鍵盤選取指令的、一個唯一的記憶存取字元。存取字元應是選單標題的第一個字母,除非別的字元更易記;兩個選單標題不能用同一個存取字元。關於指定訪問鍵與快捷鍵的詳細信息,請參閱本章前面的“用選單編輯器建立選單”部分。
4.如果命令在完成之前還需要附加信息,則在其名稱後面應有一個省略號(…),比如顯示一個對話框的命令(“另存為…”,“首選項…”)。
5.項目名稱盡量簡短。如果要讓應用程式在地化,那麼,在外文版中字詞長度會增加將近百分之三十,這樣也許沒有足夠空間列出各個選單項目。有關應用程式在地化的更詳細內容,請參閱第十六章「國際發行」。
菜單命名約定
為了使程式碼更可讀和更易於維護,在選單編輯器中設定Name屬性時遵循已確定的命名約定是一個好方法。大多數命名約定規則都建議用前綴來識別物件(即,對選單控制項以mnu),其後緊跟著頂層選單的名稱(如File)。對於子選單,其後再緊跟著該子選單的標題(如mnuFileOpen)。
詳細資訊有關所建議的命名約定的範例,請參閱附錄B「VisualBasic編碼約定」。有關所建議的命名約定的範例,請參閱「VisualBasic編碼約定」。
->