.net中form之間的互相調(diào)用
有了.net,以前的一些編程思想有了改變。記得在vb6的時代,我們經(jīng)常會建立幾個form然后直接利用load方法來調(diào)用。到了.net時代了,vb也引入了類的概念。所以窗體調(diào)用的方式也改變了。例如:
public frm as new form1
frm.show()
因為form1在這里是一個類,而不是一個對象。我們定義了一個form1類的對象frm,通過new方法將其實例化,并且顯示它。有時候初學(xué)者會使用:
public frm as form
這樣在使用frm的成員時會提示,沒有實例化的錯誤。new方法就是新建一個form1的實例。如果不使用new方法,則需要通過其它的手段將已經(jīng)創(chuàng)建的form1實例的句柄傳給frm對象。這樣做的好處是,我們可以見了很多個form1的對象,在程序中作為一個通用的form,當(dāng)然也可以只用一個。這時候很多人可以自然而然的去使用form1的公共成員。但是有時候需要在form1種使用form2的成員,這就要考慮到兩個form關(guān)系的問題。下面具一個例子:
在mfc的mdi類型的工程中,我們知道會有mainfrm和childfrm的概念。現(xiàn)在用一個.net的winform工程舉例。主框架是一個mainfrm(將其設(shè)為一個mdi容器),包含了frmhome,frmreport,frmoption等子窗體。程序開始時候,我們需要將frmhome等加載到mainfrm中。然后根據(jù)不同的消息顯示不同的子窗體。而且這些子窗體之間的成員也需要互相調(diào)用。這時候我們就該在mainfrm中定義幾個public的成員frmhome,frmreport,frmoption等。
public frmhome as new frmhome
public frmreport as new frmreport
public frmoption as new frmoption
private sub mainfrm_load(byval sender as system.object, byval e as system.eventargs) handles mybase.load
frmhome.mdiparent = me
frmhome.show()
frmhome.dock = dockstyle.fill
end sub
現(xiàn)在我們在frmreport中想要調(diào)用frmhome的成員,從下圖這個結(jié)構(gòu)中,我們就可以想到通過mainfrm來作為橋梁。可以在每個子窗體上定義一個主框架的對象,也可以定義一個全局變量用來保存mainfrm的句柄。
如果在子窗體上定義一個mainfrm的對象,我們需要把已經(jīng)創(chuàng)建好的程序主框架的句柄傳給這個對象:
dim pmainfrm as mainfrm
pmainfrm = ctype(me.mdiparent, mainfrm)
這樣我們就可以使用pmainfrm.frmhome的成員變量了。這有點類似在mfc的mdi中常用的定義一個pmainfrm的指針用來尋找主框架。
cmainframe* pmainfrm = (cmainframe*)gettoplevelframe();
cmainframe* pmainfrm = (cmainframe*)afxgetapp()->m_pmainwnd;
如果僅僅是兩個窗體之間的調(diào)用,也是可以使用的。只要知道兩個form之間的關(guān)系,通常都是child,parent,owner之類的關(guān)系。例如:
dim frm as form1
frm = ctype(me.owner, form1)
新聞熱點
疑難解答
圖片精選