




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
精選優(yōu)質(zhì)文檔-----傾情為你奉上精選優(yōu)質(zhì)文檔-----傾情為你奉上專心---專注---專業(yè)專心---專注---專業(yè)精選優(yōu)質(zhì)文檔-----傾情為你奉上專心---專注---專業(yè)VB中動態(tài)創(chuàng)建控件VB相關(guān)技術(shù):創(chuàng)建數(shù)據(jù)驅(qū)動窗體所謂數(shù)據(jù)驅(qū)動窗體就是根據(jù)所請求的數(shù)據(jù)的不同生成相應(yīng)的窗體。舉例來講,假設(shè)你現(xiàn)在有一個數(shù)據(jù)庫,其中有些字段必須根據(jù)登錄者的身份加以顯示,授權(quán)級別高的用戶可以瀏覽并修改這些字段的內(nèi)容;授權(quán)級別一般的用戶只能瀏覽這些字段中的數(shù)據(jù);授權(quán)級別低的用戶則不能瀏覽這些字段中的內(nèi)容。要做到這一點就得利用VB動態(tài)添加控件的功能。動態(tài)創(chuàng)建控件無論你想要創(chuàng)建何種類型的數(shù)據(jù)驅(qū)動窗體,你必須知道如何在運行時動態(tài)地創(chuàng)建控件。你可以通過控件數(shù)組做到這一點,但VB6的Controls集合所提供的Add方法,功能更強大,靈活性更高。使用該方法,你不需要在設(shè)計時將控件的實例放在窗體上。實際上,用Add方法你甚至可以創(chuàng)建程序在編譯時根本不存在的控件。這種方法的用法也很簡單:'聲明一個窗體級的變量
DimWithEventstxtTotalAsTextBoxSubCreateTextbox()
'創(chuàng)建新的Textbox控件
SettxtTotal=Controls.Add("VB.TextBox","txtTotal")
'將控件移動到你所需要的地方
txtTotal.Move1000,800,1200,300
'創(chuàng)建時,所有的控件都是不可見的
txtTotal.Visible=True
EndSub
請注意Add方法的第二個參數(shù):分配給控件的名稱。從代碼可讀性出發(fā),這個名稱一般都與變量名相同。你可以用這個名稱從Controls集合中獲取相應(yīng)的控件或移除該控件。例如:Controls.Remove"txtTotal"在變量聲明時加上WithEvents關(guān)鍵字,即使在設(shè)計時窗體不存在該控件,你也可以為該控件的事件編寫代碼。上面所講的方法只適合解決VB內(nèi)置的控件。例如,當(dāng)你要添加一個TreeView控件時,VB會要求你證明你已經(jīng)得到了合法的授權(quán)來創(chuàng)建該控件的實例。換句話說,VB要證明這個控件是買來的,而不是從其它附有該控件的程序中借來的。要證明你經(jīng)過了合法的授權(quán)有下面幾種方法:在窗體上放置一個控件。這也是最簡單的方法。你完全沒有必要將這個窗體顯示出來。
將相關(guān)的控件添加到工具箱中,然后在“工程屬性”對話框的“生成”標(biāo)簽頁中取消選擇“刪除有關(guān)未使用的ActiveX控件的信息”這一項。
向Licenses集合添加一個元素。例如:Debug.PrintLicenses.Add("MSMask.MaskedEdBox")
僅僅創(chuàng)建了控件并不足夠要創(chuàng)建一個數(shù)據(jù)驅(qū)動窗體,僅僅知道動態(tài)創(chuàng)建控件還不夠。例如:現(xiàn)在你要創(chuàng)建一個能根據(jù)數(shù)據(jù)庫中表的不同字段自動生成控件的窗體。該窗體可能會創(chuàng)建單行文本框,其長度隨字段長度不同而不同;也可能會創(chuàng)建單選按鈕或復(fù)選按鈕以顯示布爾型字段;甚至可能創(chuàng)建一個多行文本框顯示備注型字段。你需要解決的第一個問題是:文本框控件的Multiline屬性在運行時是只讀的,只在設(shè)計時可用。幸好,微軟的MicrosoftWindowlessControls6.0可以解決這個問題。這組控件集包括了輕量級的TextBox,ComboBox,ListBox,CheckBox,OptionButton,CommandButton和兩個scrollbar控件。這些控件與VB內(nèi)置的相應(yīng)的控件最大的區(qū)別在于:這些控件的所有屬性在運行時是可讀寫的。在VB的安裝光盤中的Common\Tools\VB\WinLess文件夾中可以找到這個控件組。用下面的代碼可以創(chuàng)建一個多行文本框:DimWithEventstxtEditorAsMSWLess.WLTextPrivateSubCreateEditor()
SettxtEditor=Controls.Add("MSWLess.WLText","txtEditor")
txtEditor.Move0,0,4000,4000
txtEditor.MultiLine=True
txtEditor.ScrollBars=wlBoth
txtEditor.Visible=True
EndSub
另外一個問題比較復(fù)雜:在事先不知道要創(chuàng)建多少個控件的情況下,如何給每個對新創(chuàng)建的控件的引用分配唯一的帶WithEvents關(guān)鍵字的變量。換句話說就是要對新創(chuàng)建的控件的事件進(jìn)行編程,前提是你在設(shè)計時不知道程序會創(chuàng)建多少個控件。使用對象數(shù)組顯然不行,因為不能用WithEvents關(guān)鍵字聲明一個對象數(shù)組;更壞的情況是,資一個變量定義為AsControl或AsObject也不行,因為還是不能用WithEvents。問題源自于我們無法在運行時捕獲一個對象數(shù)組事件。所以我們只能采取曲線救國的辦法。所要的編寫的代碼可能比你想象的多,不過這個解決方法很有趣,值得我們這樣去做。我們需要兩個輔助類模塊來捕獲事件,分別取名為ControlItems和ControlItem。ControlItems是一個集合類,其中保存了ControlItem對象及其數(shù)量。該數(shù)量等于你所要對之編程的控件的數(shù)量。ControlItem類的每一份實例捕獲控件產(chǎn)生的事件,然后調(diào)用在其所屬的ControlItems集合類中的過程,最后由ControlItems在窗體中觸發(fā)事件并執(zhí)行事件中的代碼。整個過程如下圖所示:捕獲多個控件的事件為簡單起見,假設(shè)你要捕獲來自所有的動態(tài)添加到窗體上去的控件的Validate事件。為完成這個工作,ControlItems集合類必須向父窗體展示該事件,并隨時準(zhǔn)備接收來自其子ControlItem類的通知以觸發(fā)事件。代碼如下:EventValidate(CtrlItemAsControlItem,CancelAsBoolean)
Privatem_ControlItemsAsNewCollection'向集合中添加一個新的ControlItem項目
FunctionAdd(ctrlAsControl)AsControlItem
DimnewItemAsNewControlItem
newItem.Initctrl,Me
'添加到私有類
m_ControlItems.AddnewItem
'返回新項目給調(diào)用者
SetAdd=newItem
EndFunctionFriendSubNotify_Validate(ItemAsControlItem,CancelAsBoolean)
RaiseEventValidate(Item,Cancel)
EndSub
ControlItem類必須捕獲來自動態(tài)添加到窗體中的控件的事件,并通知其所屬的ControlItems集合類。很顯然,ControlItem類必須有一個用WithEvents關(guān)鍵字定義的變量來引用真正的控件。這意味著你不能將變量聲明為AsControl或AsObject。如果你決定在窗體中所動態(tài)添加的控件不使用VB內(nèi)置的控件的話,這個問題的解決辦法相當(dāng)?shù)暮唵?。你只需要將變量聲明為VBControlExtender類型就行了。對于創(chuàng)建數(shù)據(jù)驅(qū)動窗體來講,不使用VB內(nèi)置的控件并不是一件大不了的事。將變量聲明為VBControlExtender,并加上WithEvents關(guān)鍵字,你就能直接捕獲Validate,GotFocus,LostFocus,DragDrop和DragOver這幾個事件了。如果要捕獲其它更多的事件,你可以使用ObjectEvent。下面是ControlItem類模塊中的代碼:PublicWithEventsCtrlAsVBControlExtender
'所屬的ControlItems對象
Dimm_ParentAsControlItemsSubInit(ctlAsObject,parntAsControlItems)
SetCtrl=ctl
Setm_Parent=parnt
EndSubPrivateSubCtrl_Validate(CancelAsBoolean)
'通知所屬的ControlItems類
m_Parent.Notify_ValidateMe,Cancel
EndSub
將下面的代碼放入窗體中,就可以捕獲動態(tài)添加的控件所產(chǎn)生的事件了:DimWithEventsCtrlItemsAsNewControlItemsPrivateSubcmdCreateControls_Click()
DimctrlAsControl
'創(chuàng)建兩個文本框并將它們添加到ControlItems集合?Setctrl=Controls.Add("MSWLess.WLText","One")
ctrl.Move100,200,1000,300
ctrl.Visible=True
CtrlItems.Addctrl
'注意你可以使用同一個變量
Setctrl=Controls.Add("MSWLess.WLText","Two")
ctrl.Move100,800,1000,300
ctrl.Visible=True
CtrlItems.Addctrl
EndSubPrivateSubCtrlItems_Validate(CtrlItemAsControlItem,CancelAsBoolean)
'拒絕空字符串-注意如何引用控件的屬?IfCtrlItem.Ctrl.Text=""
ThenCancel=True
EndSub現(xiàn)在解決了最困難的部分,要創(chuàng)建一個數(shù)據(jù)驅(qū)動窗體就變得簡單了**************************************************************
****************************************************************
動態(tài)添加控件VB6有一個新功能,可以動態(tài)添加控件,不用控件數(shù)組:object.Add(ProgID,name,container)
參數(shù)說明Object必需的。一個對象表達(dá)式,其值是“應(yīng)用于”列表中的一個對象。
ProgID必需的。一個標(biāo)識控件的字符串。大多數(shù)控件的ProgID都可通過查看對象瀏覽器來決定。控件的ProgID是由控件的庫和類組成的。
例如,CommandButton控件的ProgID是VB.CommandButton。在ProgID與對象瀏覽器中所顯示的不一樣的情況下,VisualBasic
將顯示一個包括正確ProgId的錯誤信息。
name必要的。一個字符串,用來標(biāo)識集合的成員。
container可選的。一個對象引用,它指定控件的容器。如果沒有指定或為NULL,缺省值為Controls集合所屬的容器。通過指定該參數(shù),可以把一個控件放置在任何現(xiàn)存的容器控件(如Frame控件)中。用戶控件或ActiveX文檔也可以作為一個容器。
舉例://在picture1上面添加一個commandbutton
PrivateSubForm_Load()
Form1.Controls.Add"VB.CommandButton","cmdOk",Picture1
WithForm1!cmdOk
.Visible=True
.Width=500
.Caption="確認(rèn)(&Y)"
EndWith
EndSub
重點:當(dāng)您添加一個未引用的需要許可證的控件到一個現(xiàn)存的(已部署好的)應(yīng)用程序時,在使用Add方法之前您必須也添加這個控件的許可證關(guān)鍵字。在運行時添加未引用的控件:
您也可以利用Add方法來動態(tài)添加一個在工程中沒有被引用的控件。(“未引用的”控件是不出現(xiàn)在Toolbox中的控件)。為此,您必須也把控件的License關(guān)鍵字添加到Licenses集合中。下面的示例中在添加控件本身之前添加了控件的許可證關(guān)鍵字:OptionExplicit
PrivateWithEventsextCtlAsVBControlExtenderPrivateSubForm_Load()
Licenses.Add"prjWeeks.WeeksCtl","xydsfasfjewfe"
SetextCtl=Form1.Controls.Add("prjWeeks.WeeksCtl","ctl1")
extCtl.Visible=True'Thecontrolisinvisiblebydefault.
EndSub但是,為了編程這樣一個未引用控件的事件,您必須使用WithEvents關(guān)鍵字聲明一個對象變量為VBControlExtender對象(如上),并且設(shè)置該對象變量到Add方法返回的引用上。然后,利用VBControlExtender對象的ObjectEvent事件來編程該控件的事件。下面是一個簡單的例子。OptionExplicit
DimWithEventsobjExtAsVBControlExtender'聲明Extender變量PrivateSubLoadControl()
Licenses.Add"Project1.Control1","xydsfasfjewfe"
SetobjExt=Controls.Add("Project1.Control1","myCtl")
objExt.Visible=True
EndSubPrivateSubextObj_ObjectEvent(InfoAsEventInfo)
'使用SelectCase編程控件的事件。
SelectCaseInfo.Name
Case"Click"
'這里處理Click事件。
'現(xiàn)在顯示其他的case
CaseElse'未知事件
'這里處理未知事件。
EndSelect
EndSubNote:不能把一個固有的控件指定給這個VBControlExtender變量;任何這種試圖將引起類型不匹配錯誤。但是,您也可以通過使用WithEvents關(guān)鍵字聲明一個對象變量,并且設(shè)置該方法返回的引用為該變量,從而編程一個動態(tài)添加控件的事件,如下所示。OptionExplicit
'聲明對象變量為CommandButton。
PrivateWithEventscmdObjectAsCommandButtonPrivateSubForm_Load()
Setcm
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年智能用電系統(tǒng)產(chǎn)品合作協(xié)議書
- 合伙經(jīng)營鏟車合同范本
- 土壤改良工程填土施工合同范本
- 劇組法律顧問合同范本
- 合伙運輸協(xié)議合同范本
- 商品陳列協(xié)議合同范本
- 各類廣告合同范本
- 廠房噴漆合同范本
- 俱樂部管理合同范本
- 廚師和飯店合同范本
- 2022屆江蘇省南京師范大學(xué)附屬中學(xué)高三(下)考前最后一模物理試題(解析版)
- 辦公用品供貨服務(wù)計劃方案
- 《普通生物學(xué)教案》word版
- 貴州省就業(yè)失業(yè)登記表
- 預(yù)防電信詐騙網(wǎng)絡(luò)詐騙講座PPT幻燈片課件
- 反興奮劑知識試題及答案
- 初中八年級上冊音樂課件4.2欣賞沃爾塔瓦河(14張)ppt課件
- 人教版五年級數(shù)學(xué)下冊每個單元教材分析(共九個單元)
- 深圳氫燃料共享單車項目投資計劃書【參考范文】
- 主要腸內(nèi)營養(yǎng)制劑成分比較
- 小學(xué)生如何理解句子的含義(課堂PPT)
評論
0/150
提交評論