透過限制焦點驗證控制項數據
Validate事件和CausesValidation屬性是在允許使用者將焦點移開控制項之前,串聯使用以確認對控制項的輸入的。例如:假設有幾個文字方塊和一個Help按鈕的應用程序,當每個文字方塊接收焦點時,您想在文字方塊的特殊驗證準則被滿足之前阻止用戶移動焦點;然而,您也想允許用戶在任何時候都能點選Help按鈕。要做到這一點,請在Validate事件中設定驗證準則,並將Help按鈕的CausesValidation屬性設為False。假如屬性設定為True(缺省設定),Validate事件將在第一個控制項上發生。假如屬性設定為False,在第一個控制項上的Validate事件將搶先發生。
Validate事件比LostFocus事件更適合驗證資料輸入項,因為LostFocus事件(依定義)是在焦點已移動後發生。相反,透過使用Validate事件,您能防止焦點移動到另一個控制項直到驗證規則被滿足。
可能的使用
資料輸入項應用程式需要執行比MaskedEdit控制項所提供的或在業務規則中發生的有效性驗證更複雜的資料輸入項有效性驗證。
窗體需要防止使用者使用TAB鍵或加速鍵將控制項移走,直到資料已輸入到欄位中。
在InternetExplorer中執行的ActiveX文件需要一種方法,使用戶在腳本程式化地移動焦點之前完成在窗體上的操作。
在Validate事件上控制焦點
Validate事件包括一個keepfocus參數。當參數設定為True時,控制項將保留焦點。這樣做有效地防止了用戶單擊其它控制項。
使用控制項數組
控制項數組是一組具有共同名稱和類型的控制項。它們的事件過程也相同。一個控制項陣列至少應有一個元素,元素數可在系統資源和記憶體允許的範圍內增加;陣列的大小也取決於每個控制項所需的記憶體和Windows資源。在控制項數組中可用到的最大索引值為32767。同一控制項數組中的元素有自己的屬性設定值。常見的控制項陣列的用處包括實作選單控制項和選項按鈕分組。
注意VisualBasic包含了在執行時間動態地將未引用的控制項新增至Controls集合中的能力。本主題僅指在設計時透過將一個控制項剪下並貼上到窗體上所新增的引用控制項。有關在運行時添加控制項的詳細信息,請參閱參考主題“Add方法(Controls集合)”和“Add方法(Licenses集合)”。
為何使用控制項數組
在設計時,使用控制項陣列新增控制項所消耗的資源比直接向窗體新增多個相同類型的控制項消耗的資源少。當希望若干控制項共用程式碼時,控制項數組也很有用。例如,如果建立了包含三個選項按鈕的控制項數組,則無論按一下哪個按鈕時都會執行相同的程式碼。
若要在執行時建立一個控制項的新實例,則新控制項必須是控制項陣列的成員。使用控制項數組時,每個新成員繼承數組的公共事件過程。
使用控制項數組機制是不可能在執行時期建立新控制項的,因為每個新控制項都繼承為數組編寫好的事件過程。例如,如果窗體上有若干文字框,且每個文字方塊都接受一個日期數值,則可建立一個控制項數組,使所有文字方塊共用同一個合法性檢查程式碼。
範例應用程式:Calc.vbp
圖7.2所示的Calculator範例應用程式(列在Samples!Alink(vbsamples)目錄中)包含兩個控制項陣列-數字按鈕和操作按鈕。
請注意範例是如何使用object(index)語法來引用每個控制項的。在建立控制項時指定索引值。實際上,在設計時為一個控制項指定任意的索引,這將使控制項成為陣列的一部分。
Index屬性區分控制項數組中的元素。當陣列中的一個控制項辨識了一個事件時,VisualBasic會呼叫公共事件過程並傳遞一個參數(Index屬性的值),分辨是哪個控制項辨識事件。
例如,Number_Click事件過程的第一行程式碼是這樣的:
PRivateSubNumber_Click(IndexAsInteger)
如果Number(0)識別事件,則VisualBasic將0作為index參數傳遞,而如果Number(1)識別事件,則VisualBasic將1作為index參數傳遞。與索引值不同,對於Number(0)到Number(9)已執行的其餘Number_Click程式碼都是相同的。
設計時建立控制項數組
設計時有三種方法建立控制項數組:
1.將相同名字賦予多個控制項。
2.複製現有的控制項並將其貼上到窗體上。
3.將控制項的Index屬性設定為非Null數值。
注意必須在「選單編輯器」中建立選單控制項陣列。關於此項目操作的詳細信息,請參閱第六章,“建立使用者介面”中的“運行時建立和修改選單”。
若要透過改變控制項名稱新增控制項數組元素:
1.繪製控制項數組中要新增的控制項(必須為相同類型的控制項)決定哪一個控制項作為陣列中的第一個元素。
2.選定控制項並將其Name設定值變成陣列第一個元素的Name設定值。
3.在陣列中為控制項輸入現有名稱時,VisualBasic將顯示一個對話框,要求確認是否要建立控制項數組。此時選擇「確定」確認操作。
例如,若控制項數組第一個元素名為cmdCtlArr,則選擇一個CommandButton將其新增至陣列中,並將其名稱設為cmdCtlArr,此時將顯示這樣一段訊息:「已經存在名為'cmdCtlArr'的控制項。選擇“確定”確認操作。
用此方法新增的控制項僅共用Name屬性和控制項類型;其它屬性與最初繪製控制項時的值相同。
若要透過複製現存控制項新增控制項數組元素:
1.繪製控制項數組中的控制項。
2.當控制項獲得焦點時,選擇「編輯」功能表中的「複製」指令。
3.在「編輯」功能表中,選擇「貼上」指令。 VisualBasic將顯示一個對話方塊詢問是否確認建立控制項陣列。選擇“確定”確認操作。指定給控制項的索引值為1。繪製的第一個控制項具有索引值0。
每個新數組元素的索引值與其新增到控制項數組中的次序相同。這樣新增控制項時,大多數視覺屬性,例如高度、寬度和顏色,將從陣列中第一個控制項複製到新控制項。
運行時新增控制項數組
在運行時,可用Load和Unload語句新增和刪除控制項數組中的控件,然而,新增的控制項必須是現有控制項數組的元素。必須在設計時建立一個(在大多數情況下)Index屬性為0的控件,然後在執行時使用下列語法:
載入控制項數組的新元素時,大多數屬性設定值將由數組中具有最小下標的現有元素複製-本例中是索引值為0的元素。因為不會自動把Visible、Index和TabIndex屬性設定值複製到控制項陣列的新元素中,所以,為了讓新加入的控制項可見,必須將其Visible屬性設為True。
注意試圖對數組中已存在的索引值使用Load語句時,VisualBasic將產生錯誤。
重點可用Unload語句刪除所有由Load語句建立的控件,然而,Unload無法刪除設計時建立的控件,無論它們是否是控件數組的一部分。
控件方案:在控制項數組中新增和刪除控件
如何在運行時添加和刪除控件,控件數組範例對此作了演示,這裡,控件是選項按鈕。根據這個範例,使用者可以新增選項按鈕,改變圖片框背景顏色。
如圖7.3所示,啟動窗體,然後在上面繪製一個圖片框、一個標籤、兩個選項按鈕和三個命令按鈕。
控制項數組應用程式的事件
接著,必須新增選項按鈕和命令按鈕的事件過程。新增窗體聲明後啟動應用程式:
DimMaxIdAsInteger
所有選項按鈕共享Click事件過程:
PrivateSuboptButton_Click(IndexAsInteger)
picDisplay.BackColor=QBColor(Index 1)
EndSub
透過「新增」指令按鈕的Click事件過程新增新的選項按鈕。本例中,在執行Load語句前,程式碼將檢查確認載入的選項按鈕數不超過十個。載入控制項之後,必須將其Visible屬性設定為True。
PrivateSubcmdAdd_Click()
IfMaxId=0ThenMaxId=1 '設定全部選項按鈕。
IfMaxId>8ThenExitSub '只允許十個按鈕。
MaxId=MaxId 1 '按鈕數增加。
LoadoptButton(MaxId) '建立新按鈕。
optButton(0).SetFocus '重置按鈕選項。
'將新按鈕放置在上一個按鈕下方。
optButton(MaxId).Top=optButton(MaxId-1)._
Top 400
optButton(MaxId).Visible=True '顯示新按鈕。
optButton(MaxId).Caption=Option&MaxId 1
EndSub
透過「刪除」指令按鈕的Click事件過程刪除選項按鈕:
PrivateSubcmdDelete_Click()
IfMaxId<=1ThenExitSub '保留最初的兩個按鈕。
UnloadoptButton(MaxId) '刪除最後的按鈕。
MaxId=MaxId-1 '按鈕數遞減。
optButton(0).SetFocus '重置按鈕選項。
EndSub
透過「關閉」按鈕的Click事件過程結束應用程式:
PrivateSubcmdClose_Click()
UnloadMe
EndSub
->