通過(guò)限制焦點(diǎn)驗(yàn)證控件數(shù)據(jù)
Validate 事件和 CausesValidation 屬性是在允許用戶將焦點(diǎn)移開(kāi)控件之前,串聯(lián)使用以確認(rèn)對(duì)控件的輸入的。例如:假設(shè)有幾個(gè)文本框和一個(gè) Help 按鈕的應(yīng)用程序,當(dāng)每個(gè)文本框接收焦點(diǎn)時(shí),您想在文本框的特殊驗(yàn)證準(zhǔn)則被滿足之前阻止用戶移動(dòng)焦點(diǎn);然而,您也想允許用戶在任何時(shí)候都能單擊 Help 按鈕。 要做到這點(diǎn),在 Validate 事件中設(shè)置驗(yàn)證準(zhǔn)則,并將 Help按鈕的 CausesValidation 屬性設(shè)置為 False。假如屬性設(shè)置為 True (缺省設(shè)置),Validate 事件將在第一個(gè)控件上發(fā)生。假如屬性設(shè)置為 False,在第一個(gè)控件上的 Validate 事件將搶先發(fā)生。
Validate 事件比 LostFocus 事件更適合驗(yàn)證數(shù)據(jù)輸入項(xiàng),因?yàn)?LostFocus 事件(按照定義)是在焦點(diǎn)已移動(dòng)后發(fā)生。相反,通過(guò)使用Validate 事件,您能防止焦點(diǎn)移動(dòng)到另一個(gè)控件直到驗(yàn)證規(guī)則被滿足。
可能的使用
數(shù)據(jù)輸入項(xiàng)應(yīng)用程序需要執(zhí)行比 Masked Edit 控件所提供的或在業(yè)務(wù)規(guī)則中發(fā)生的有效性驗(yàn)證更復(fù)雜的數(shù)據(jù)輸入項(xiàng)有效性驗(yàn)證。
窗體需要防止用戶使用 TAB 鍵或加速鍵將控件移走,直到數(shù)據(jù)已被輸入到字段中。
在 Internet Explorer 中運(yùn)行的 ActiveX 文檔需要一種方法,使用戶在腳本程序化地移動(dòng)焦點(diǎn)之前完成在窗體上的操作。
在 Validate 事件上控制焦點(diǎn)
Validate 事件包括一個(gè) keepfocus 參數(shù)。當(dāng)參數(shù)設(shè)置為 True時(shí),控件將保留焦點(diǎn)。這樣做有效地防止了用戶單擊其它控件。
使用控件數(shù)組
控件數(shù)組是一組具有共同名稱和類(lèi)型的控件。它們的事件過(guò)程也相同。一個(gè)控件數(shù)組至少應(yīng)有一個(gè)元素,元素?cái)?shù)目可在系統(tǒng)資源和內(nèi)存允許的范圍內(nèi)增加;數(shù)組的大小也取決于每個(gè)控件所需的內(nèi)存和 Windows 資源。在控件數(shù)組中可用到的索引值為 32767。同一控件數(shù)組中的元素有自己的屬性設(shè)置值。常見(jiàn)的控件數(shù)組的用處包括實(shí)現(xiàn)菜單控件和選項(xiàng)按鈕分組。
注意 Visual Basic 包括了在運(yùn)行時(shí)動(dòng)態(tài)地將未引用的控件添加到 Controls集合中的能力。本主題僅指在設(shè)計(jì)時(shí)通過(guò)將一個(gè)控件剪切和粘貼到窗體上添加的引用控件。有關(guān)在運(yùn)行時(shí)添加控件的詳細(xì)信息,請(qǐng)參閱參考主題“Add 方法(Controls 集合)”和“Add 方法(Licenses 集合)”。
為何使用控件數(shù)組
在設(shè)計(jì)時(shí),使用控件數(shù)組添加控件所消耗的資源比直接向窗體添加多個(gè)相同類(lèi)型的控件消耗的資源要少。當(dāng)希望若干控件共享代碼時(shí),控件數(shù)組也很有用。例如,如果創(chuàng)建了一個(gè)包含三個(gè)選項(xiàng)按鈕的控件數(shù)組,則無(wú)論單擊哪個(gè)按鈕時(shí)都將執(zhí)行相同的代碼。
若要在運(yùn)行時(shí)創(chuàng)建一個(gè)控件的新實(shí)例,則新控件必須是控件數(shù)組的成員。使用控件數(shù)組時(shí),每個(gè)新成員繼承數(shù)組的公共事件過(guò)程。
使用控件數(shù)組機(jī)制是不可能在運(yùn)行時(shí)創(chuàng)建新控件的,因?yàn)槊總€(gè)新控件都繼承為數(shù)組編寫(xiě)好的事件過(guò)程。例如,如果窗體上有若干文本框,而且每個(gè)文本框都接受一個(gè)日期數(shù)值,則可創(chuàng)建一個(gè)控件數(shù)組,使所有文本框共享同一個(gè)合法性檢查代碼。
示例應(yīng)用程序:Calc.vbp
圖 7.2 所示的 Calculator 示例應(yīng)用程序(列在 Samples!Alink("vbsamples")目錄中)包含兩個(gè)控件數(shù)組——數(shù)字按鈕和操作按鈕。
請(qǐng)注意示例是如何使用 object(index) 語(yǔ)法引用每個(gè)控件的。在創(chuàng)建控件時(shí)指定索引值。實(shí)際上,在設(shè)計(jì)時(shí)為一個(gè)控件指定任意的索引,這將使控件成為數(shù)組的一部分。
Index 屬性區(qū)分控件數(shù)組中的元素。當(dāng)數(shù)組中的一個(gè)控件識(shí)別了一個(gè)事件時(shí),Visual Basic 將調(diào)用公共事件過(guò)程并傳遞一個(gè)參數(shù)(Index 屬性的值),分辨是哪個(gè)控件識(shí)別事件。
例如,Number_Click 事件過(guò)程的第一行代碼是這樣的:
Private Sub Number_Click (Index As Integer)
如果 Number(0) 識(shí)別事件,則 Visual Basic 將 0 作為 index 參數(shù)傳遞,而如果 Number(1) 識(shí)別事件,則 Visual Basic 將 1 作為 index 參數(shù)傳遞。與索引值不同,對(duì)于 Number(0) 到 Number(9) 已執(zhí)行的其余 Number_Click代碼都是相同的。
設(shè)計(jì)時(shí)創(chuàng)建控件數(shù)組
設(shè)計(jì)時(shí)有三種方法創(chuàng)建控件數(shù)組:
1.將相同名字賦予多個(gè)控件。
2.復(fù)制現(xiàn)有的控件并將其粘貼到窗體上。
3.將控件的 Index 屬性設(shè)置為非 Null 數(shù)值。
注意 必須在“菜單編輯器”中創(chuàng)建菜單控件數(shù)組。關(guān)于此項(xiàng)操作的詳細(xì)信息,請(qǐng)參閱第六章,“創(chuàng)建用戶界面”中的“運(yùn)行時(shí)創(chuàng)建和修改菜單”。
要通過(guò)改變控件名稱添加控件數(shù)組元素:
1. 繪制控件數(shù)組中要添加的控件(必須為同一類(lèi)型的控件)決定哪一個(gè)控件作為數(shù)組中的第一個(gè)元素。
2. 選定控件并將其 Name 設(shè)置值變成數(shù)組第一個(gè)元素的 Name 設(shè)置值。
3. 在數(shù)組中為控件輸入現(xiàn)有名稱時(shí),Visual Basic 將顯示一個(gè)對(duì)話框,要求確認(rèn)是否要?jiǎng)?chuàng)建控件數(shù)組。此時(shí)選擇“確定”確認(rèn)操作。
例如,若控件數(shù)組第一個(gè)元素名為 cmdCtlArr,則選擇一個(gè) CommandButton將其添加到數(shù)組中,并將其名稱設(shè)置為 cmdCtlArr,此時(shí)將顯示這樣一段信息:“已經(jīng)存在名為 'cmdCtlArr' 的控件。是否要?jiǎng)?chuàng)建控件數(shù)組?”。選擇“確定”確認(rèn)操作。
Validate 事件和 CausesValidation 屬性是在允許用戶將焦點(diǎn)移開(kāi)控件之前,串聯(lián)使用以確認(rèn)對(duì)控件的輸入的。例如:假設(shè)有幾個(gè)文本框和一個(gè) Help 按鈕的應(yīng)用程序,當(dāng)每個(gè)文本框接收焦點(diǎn)時(shí),您想在文本框的特殊驗(yàn)證準(zhǔn)則被滿足之前阻止用戶移動(dòng)焦點(diǎn);然而,您也想允許用戶在任何時(shí)候都能單擊 Help 按鈕。 要做到這點(diǎn),在 Validate 事件中設(shè)置驗(yàn)證準(zhǔn)則,并將 Help按鈕的 CausesValidation 屬性設(shè)置為 False。假如屬性設(shè)置為 True (缺省設(shè)置),Validate 事件將在第一個(gè)控件上發(fā)生。假如屬性設(shè)置為 False,在第一個(gè)控件上的 Validate 事件將搶先發(fā)生。
Validate 事件比 LostFocus 事件更適合驗(yàn)證數(shù)據(jù)輸入項(xiàng),因?yàn)?LostFocus 事件(按照定義)是在焦點(diǎn)已移動(dòng)后發(fā)生。相反,通過(guò)使用Validate 事件,您能防止焦點(diǎn)移動(dòng)到另一個(gè)控件直到驗(yàn)證規(guī)則被滿足。
可能的使用
數(shù)據(jù)輸入項(xiàng)應(yīng)用程序需要執(zhí)行比 Masked Edit 控件所提供的或在業(yè)務(wù)規(guī)則中發(fā)生的有效性驗(yàn)證更復(fù)雜的數(shù)據(jù)輸入項(xiàng)有效性驗(yàn)證。
窗體需要防止用戶使用 TAB 鍵或加速鍵將控件移走,直到數(shù)據(jù)已被輸入到字段中。
在 Internet Explorer 中運(yùn)行的 ActiveX 文檔需要一種方法,使用戶在腳本程序化地移動(dòng)焦點(diǎn)之前完成在窗體上的操作。
在 Validate 事件上控制焦點(diǎn)
Validate 事件包括一個(gè) keepfocus 參數(shù)。當(dāng)參數(shù)設(shè)置為 True時(shí),控件將保留焦點(diǎn)。這樣做有效地防止了用戶單擊其它控件。
使用控件數(shù)組
控件數(shù)組是一組具有共同名稱和類(lèi)型的控件。它們的事件過(guò)程也相同。一個(gè)控件數(shù)組至少應(yīng)有一個(gè)元素,元素?cái)?shù)目可在系統(tǒng)資源和內(nèi)存允許的范圍內(nèi)增加;數(shù)組的大小也取決于每個(gè)控件所需的內(nèi)存和 Windows 資源。在控件數(shù)組中可用到的索引值為 32767。同一控件數(shù)組中的元素有自己的屬性設(shè)置值。常見(jiàn)的控件數(shù)組的用處包括實(shí)現(xiàn)菜單控件和選項(xiàng)按鈕分組。
注意 Visual Basic 包括了在運(yùn)行時(shí)動(dòng)態(tài)地將未引用的控件添加到 Controls集合中的能力。本主題僅指在設(shè)計(jì)時(shí)通過(guò)將一個(gè)控件剪切和粘貼到窗體上添加的引用控件。有關(guān)在運(yùn)行時(shí)添加控件的詳細(xì)信息,請(qǐng)參閱參考主題“Add 方法(Controls 集合)”和“Add 方法(Licenses 集合)”。
為何使用控件數(shù)組
在設(shè)計(jì)時(shí),使用控件數(shù)組添加控件所消耗的資源比直接向窗體添加多個(gè)相同類(lèi)型的控件消耗的資源要少。當(dāng)希望若干控件共享代碼時(shí),控件數(shù)組也很有用。例如,如果創(chuàng)建了一個(gè)包含三個(gè)選項(xiàng)按鈕的控件數(shù)組,則無(wú)論單擊哪個(gè)按鈕時(shí)都將執(zhí)行相同的代碼。
若要在運(yùn)行時(shí)創(chuàng)建一個(gè)控件的新實(shí)例,則新控件必須是控件數(shù)組的成員。使用控件數(shù)組時(shí),每個(gè)新成員繼承數(shù)組的公共事件過(guò)程。
使用控件數(shù)組機(jī)制是不可能在運(yùn)行時(shí)創(chuàng)建新控件的,因?yàn)槊總€(gè)新控件都繼承為數(shù)組編寫(xiě)好的事件過(guò)程。例如,如果窗體上有若干文本框,而且每個(gè)文本框都接受一個(gè)日期數(shù)值,則可創(chuàng)建一個(gè)控件數(shù)組,使所有文本框共享同一個(gè)合法性檢查代碼。
示例應(yīng)用程序:Calc.vbp
圖 7.2 所示的 Calculator 示例應(yīng)用程序(列在 Samples!Alink("vbsamples")目錄中)包含兩個(gè)控件數(shù)組——數(shù)字按鈕和操作按鈕。
請(qǐng)注意示例是如何使用 object(index) 語(yǔ)法引用每個(gè)控件的。在創(chuàng)建控件時(shí)指定索引值。實(shí)際上,在設(shè)計(jì)時(shí)為一個(gè)控件指定任意的索引,這將使控件成為數(shù)組的一部分。
Index 屬性區(qū)分控件數(shù)組中的元素。當(dāng)數(shù)組中的一個(gè)控件識(shí)別了一個(gè)事件時(shí),Visual Basic 將調(diào)用公共事件過(guò)程并傳遞一個(gè)參數(shù)(Index 屬性的值),分辨是哪個(gè)控件識(shí)別事件。
例如,Number_Click 事件過(guò)程的第一行代碼是這樣的:
Private Sub Number_Click (Index As Integer)
如果 Number(0) 識(shí)別事件,則 Visual Basic 將 0 作為 index 參數(shù)傳遞,而如果 Number(1) 識(shí)別事件,則 Visual Basic 將 1 作為 index 參數(shù)傳遞。與索引值不同,對(duì)于 Number(0) 到 Number(9) 已執(zhí)行的其余 Number_Click代碼都是相同的。
設(shè)計(jì)時(shí)創(chuàng)建控件數(shù)組
設(shè)計(jì)時(shí)有三種方法創(chuàng)建控件數(shù)組:
1.將相同名字賦予多個(gè)控件。
2.復(fù)制現(xiàn)有的控件并將其粘貼到窗體上。
3.將控件的 Index 屬性設(shè)置為非 Null 數(shù)值。
注意 必須在“菜單編輯器”中創(chuàng)建菜單控件數(shù)組。關(guān)于此項(xiàng)操作的詳細(xì)信息,請(qǐng)參閱第六章,“創(chuàng)建用戶界面”中的“運(yùn)行時(shí)創(chuàng)建和修改菜單”。
要通過(guò)改變控件名稱添加控件數(shù)組元素:
1. 繪制控件數(shù)組中要添加的控件(必須為同一類(lèi)型的控件)決定哪一個(gè)控件作為數(shù)組中的第一個(gè)元素。
2. 選定控件并將其 Name 設(shè)置值變成數(shù)組第一個(gè)元素的 Name 設(shè)置值。
3. 在數(shù)組中為控件輸入現(xiàn)有名稱時(shí),Visual Basic 將顯示一個(gè)對(duì)話框,要求確認(rèn)是否要?jiǎng)?chuàng)建控件數(shù)組。此時(shí)選擇“確定”確認(rèn)操作。
例如,若控件數(shù)組第一個(gè)元素名為 cmdCtlArr,則選擇一個(gè) CommandButton將其添加到數(shù)組中,并將其名稱設(shè)置為 cmdCtlArr,此時(shí)將顯示這樣一段信息:“已經(jīng)存在名為 'cmdCtlArr' 的控件。是否要?jiǎng)?chuàng)建控件數(shù)組?”。選擇“確定”確認(rèn)操作。

