VB中動態(tài)創(chuàng)建控件_第1頁
VB中動態(tài)創(chuàng)建控件_第2頁
VB中動態(tài)創(chuàng)建控件_第3頁
VB中動態(tài)創(chuàng)建控件_第4頁
VB中動態(tài)創(chuàng)建控件_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論