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