通過限制焦點(diǎn)驗(yàn)證控件數(shù)據(jù)
Validate事件和CausesValidation屬性是在允許用戶將焦點(diǎn)移開控件之前,串聯(lián)使用以確認(rèn)對控件的輸入的。例如:假設(shè)有幾個文本框和一個Help按鈕的應(yīng)用程序,當(dāng)每個文本框接收焦點(diǎn)時,您想在文本框的特殊驗(yàn)證準(zhǔn)則被滿足之前阻止用戶移動焦點(diǎn);然而,您也想允許用戶在任何時候都能單擊Help按鈕。要做到這點(diǎn),在Validate事件中設(shè)置驗(yàn)證準(zhǔn)則,并將Help按鈕的CausesValidation屬性設(shè)置為False。假如屬性設(shè)置為True(缺省設(shè)置),Validate事件將在第一個控件上發(fā)生。假如屬性設(shè)置為False,在第一個控件上的Validate事件將搶先發(fā)生。
Validate事件比LostFocus事件更適合驗(yàn)證數(shù)據(jù)輸入項(xiàng),因?yàn)長ostFocus事件(按照定義)是在焦點(diǎn)已移動后發(fā)生。相反,通過使用Validate事件,您能防止焦點(diǎn)移動到另一個控件直到驗(yàn)證規(guī)則被滿足。
可能的使用
數(shù)據(jù)輸入項(xiàng)應(yīng)用程序需要執(zhí)行比MaskedEdit控件所提供的或在業(yè)務(wù)規(guī)則中發(fā)生的有效性驗(yàn)證更復(fù)雜的數(shù)據(jù)輸入項(xiàng)有效性驗(yàn)證。
窗體需要防止用戶使用TAB鍵或加速鍵將控件移走,直到數(shù)據(jù)已被輸入到字段中。
在InternetExplorer中運(yùn)行的ActiveX文檔需要一種方法,使用戶在腳本程序化地移動焦點(diǎn)之前完成在窗體上的操作。
在Validate事件上控制焦點(diǎn)
Validate事件包括一個keepfocus參數(shù)。當(dāng)參數(shù)設(shè)置為True時,控件將保留焦點(diǎn)。這樣做有效地防止了用戶單擊其它控件。
使用控件數(shù)組
控件數(shù)組是一組具有共同名稱和類型的控件。它們的事件過程也相同。一個控件數(shù)組至少應(yīng)有一個元素,元素數(shù)目可在系統(tǒng)資源和內(nèi)存允許的范圍內(nèi)增加;數(shù)組的大小也取決于每個控件所需的內(nèi)存和Windows資源。在控件數(shù)組中可用到的最大索引值為32767。同一控件數(shù)組中的元素有自己的屬性設(shè)置值。常見的控件數(shù)組的用處包括實(shí)現(xiàn)菜單控件和選項(xiàng)按鈕分組。
注意VisualBasic包括了在運(yùn)行時動態(tài)地將未引用的控件添加到Controls集合中的能力。本主題僅指在設(shè)計時通過將一個控件剪切和粘貼到窗體上添加的引用控件。有關(guān)在運(yùn)行時添加控件的詳細(xì)信息,請參閱參考主題“Add方法(Controls集合)”和“Add方法(Licenses集合)”。
為何使用控件數(shù)組
在設(shè)計時,使用控件數(shù)組添加控件所消耗的資源比直接向窗體添加多個相同類型的控件消耗的資源要少。當(dāng)希望若干控件共享代碼時,控件數(shù)組也很有用。例如,如果創(chuàng)建了一個包含三個選項(xiàng)按鈕的控件數(shù)組,則無論單擊哪個按鈕時都將執(zhí)行相同的代碼。
若要在運(yùn)行時創(chuàng)建一個控件的新實(shí)例,則新控件必須是控件數(shù)組的成員。使用控件數(shù)組時,每個新成員繼承數(shù)組的公共事件過程。
使用控件數(shù)組機(jī)制是不可能在運(yùn)行時創(chuàng)建新控件的,因?yàn)槊總€新控件都繼承為數(shù)組編寫好的事件過程。例如,如果窗體上有若干文本框,而且每個文本框都接受一個日期數(shù)值,則可創(chuàng)建一個控件數(shù)組,使所有文本框共享同一個合法性檢查代碼。
示例應(yīng)用程序:Calc.vbp
圖7.2所示的Calculator示例應(yīng)用程序(列在Samples!Alink("vbsamples")目錄中)包含兩個控件數(shù)組——數(shù)字按鈕和操作按鈕。
請注意示例是如何使用object(index)語法引用每個控件的。在創(chuàng)建控件時指定索引值。實(shí)際上,在設(shè)計時為一個控件指定任意的索引,這將使控件成為數(shù)組的一部分。
Index屬性區(qū)分控件數(shù)組中的元素。當(dāng)數(shù)組中的一個控件識別了一個事件時,VisualBasic將調(diào)用公共事件過程并傳遞一個參數(shù)(Index屬性的值),分辨是哪個控件識別事件。
例如,Number_Click事件過程的第一行代碼是這樣的:
控件數(shù)組應(yīng)用程序的事件
接著,必須添加選項(xiàng)按鈕和命令按鈕的事件過程。添加窗體聲明后啟動應(yīng)用程序:
DimMaxIdAsInteger
所有選項(xiàng)按鈕共享Click事件過程:
PrivateSuboptButton_Click(IndexAsInteger)
picDisplay.BackColor=QBColor(Index 1)
EndSub
通過“添加”命令按鈕的Click事件過程添加新的選項(xiàng)按鈕。本例中,在執(zhí)行Load語句前,代碼將檢查確認(rèn)加載的選項(xiàng)按鈕數(shù)不超過十個。加載控件之后,必須將其Visible屬性設(shè)置為True。
PrivateSubcmdAdd_Click()
IfMaxId=0ThenMaxId=1 '設(shè)置全部選項(xiàng)按鈕。
IfMaxId>8ThenExitSub '只允許十個按鈕。
MaxId=MaxId 1 '按鈕計數(shù)遞增。
LoadoptButton(MaxId) '創(chuàng)建新按鈕。
optButton(0).SetFocus '重置按鈕選項(xiàng)。
'將新按鈕放置在上一個按鈕下方。
optButton(MaxId).Top=optButton(MaxId-1)._
Top 400
optButton(MaxId).Visible=True '顯示新按鈕。
optButton(MaxId).Caption="Option"&MaxId 1
EndSub
通過“刪除”命令按鈕的Click事件過程刪除選項(xiàng)按鈕:
PrivateSubcmdDelete_Click()
IfMaxId<=1ThenExitSub '保留最初的兩個按鈕。
UnloadoptButton(MaxId) '刪除最后的按鈕。
MaxId=MaxId-1 '按鈕計數(shù)遞減。
optButton(0).SetFocus '重置按鈕選項(xiàng)。
EndSub
通過“關(guān)閉”按鈕的Click事件過程結(jié)束應(yīng)用程序:
PrivateSubcmdClose_Click()
UnloadMe
EndSub
新聞熱點(diǎn)
疑難解答