創建對象
創建對象的最簡單方法是在“工具箱”中雙擊控件。但是,對VisualBasic中的所有可用對象以及來自其它應用程序的所有可用對象,要想充分體現它們的優勢,可在運行時用VisualBasic的可編程性能創立對象。
1.用對象變量創建對象引用
2.用類模塊“從零開始”創建自己的對象
3.用集合對象創建自己的集合
詳細信息在其它章節將會介紹如何訪問對象。例如,在第十章“用部件編程”中將討論CreateObject和GetObject函數。
使用對象變量
除了存儲值以外,變量可引用對象。如同給變量賦值一樣,基於下列相同理由,可把對象賦給變量:
1.變量名往往比變量所含的值(或者,在此情況下,所含值就是它們引用的對象)短而好記。
2.在運行代碼時,為了引用其它對象,應改變變量。
3.引用包含對象的變量比反復引用對象本身有更高的效率。
使用對象變量與使用常規變量一樣,只不過多了把對象賦予變量這一步:
4.首先聲明變量:
DimvariableAsclass
5.然後把對象賦予變量:
Setvariable=object
聲明對象變量
聲明對象變量的方法和聲明其它變量一樣,要用Dim、ReDim、Static、Private和Public。僅有的不同在於可選的New關鍵字和Class參數,本章後面將會對New關鍵字和Class參數都作介紹。語法是:
{Dim|ReDim|Static|Private|Public}variableAs[New]class
例如,可以聲明一個對象變量,它引用應用程序中的被稱做frmMain的窗體:
DimFormVarAsNewfrmMain '聲明一個類型為frmMain
'的對象變量。
也可以聲明一個對象變量,它引用應用程序中的任何窗體:
DimanyFormAsForm '一般窗體變量。
類似地,可以聲明一個對象變量,它能夠引用應用程序中的任何文本框:
DimanyTextAsTextBox '可以引用任何文本框
'(但只能是一個文本框)。
還可以聲明一個對象變量,它能夠引用任何類型的控件:
DimanyControlAsControl '一般控件變量。
注意,可以聲明一個引用應用程序中的指定窗體的窗體變量,但不能聲引用特定控件的控件變量。可以聲明能夠引用控件的特定類型(如TextBox或列表框)的控件變量,但不是引用那種類型的一個特定控件(如txtEntry或List1)。但是,可把特定的控件賦予那種類型的變量。例如,對於具有列表框lstSample的窗體可以這樣編碼:
DimobjDemoAsListBox
SetobjDemo=lstSample
賦值對象變量
用Set語句將對象賦予對象變量:
Setvariable=object
無論何時,只要希望對象變量引用對象,就可使用Set語句。
有時可用對象變量,尤其可用控件變量直接縮短要鍵入的代碼。例如,原來的代碼是這樣的:
IffrmAccountDisplay!txtAccountBalance.Text<0Then
frmAccountDisplay!txtAccountBalance.BackColor=0
frmAccountDisplay!txtAccountBalance.ForeColor=255
EndIf
如果使用控件變量,程序就可顯著縮短:
DimBalAsTextBox
SetBal=frmAccountDisplay!txtAccountBalance
IfBal.Text<0Then
Bal.BackColor=0
Bal.ForeColor=255
EndIf
特定對象類型與一般對象類型
特定的對象變量必須引用特定類型的對象或類。特定的窗體變量只能引用應用程序中的一個窗體(盡管可在該窗體的諸多實例中引用其中之一)。與此相似,特定的控件變量只能引用應用程序中的特定類型的控件,比如TextBox或者列表框。請看一例,打開新的工程,在窗體中放置一文本框。將下列代碼添加到窗體中:
PrivateSubForm_Click()
DimanyTextAsTextBox
SetanyText=Text1
anyText.Text="Hello"
EndSub
運行應用程序並單擊窗體。文本框的Text屬性將變成"Hello"。
一般對象變量可在多種特定對象類型中引用其中一種。例如,一般窗體變量可引用應用程序中的任何窗體;一般控件變量可引用應用程序中任何窗體上的任何控件。請看一例,打開新的工程並在窗體中按任意順序放置若干Frame、Label和CommandButton控件。將下列代碼添加到窗體中:
PrivateSubForm_Click()
DimanyControlAsControl
SetanyControl=Form1.Controls(3)
anyControl.Caption="Hello"
EndSub
運行程序並單擊窗體。剛才放入窗體中的第三個控件的標題將變成"Hello"。
VisualBasic中有四種一般對象:
在不知道變量運行時是否引用特定類型的對象時,一般對象變量是很有用的。例如,如果要書寫代碼,並使之在應用程序的任何窗體中都可操作,則必須使用一般窗體變量。
注意由於應用程序中只能有一個MDI窗體,因此不必使用一般的MDIForm類型。無論何時,一旦需要聲明引用MDI窗體的窗體變量,就可用特定的MDIForm類型(或者是MDIForm1,或者是對MDI窗體的Name屬性指定的任何名稱),而不用一般的MDIForm類型。實際上,由於在運行應用程序前,VisualBasic就能夠決定引用特定窗體類型的屬性和方法,因此總應使用特定的MDIForm類型。
只是出於完整性的考慮才提供一般的MDIForm類型;在VisualBasic的今後版本中,單個應用程序中可以擁有多個MDI窗體,這將是非常有用的。
作為對象的窗體
窗體最常用到的是構造應用程序界面,但也常常是應用程序中其它模塊調用的對象。窗體與類模塊關系密切。兩者之間的主要區別在於,窗體是可視對象,而類模塊卻沒有可視界面。
添加自定義方法和屬性
可對窗體添加自定義方法和屬性,並可從應用程序中的其它模塊訪問它們。為了創建窗體的新方法,請添加用Public聲明的過程。
'自定義Form1的方法。
PublicSubLateJobsCount()
.
. '<statements>
.
EndSub
可用下面這個語句從其它模塊調用LateJobsCount過程:
Form1.LateJobsCount
創建窗體的新屬性就像在窗體模塊中聲明一個公用變量那樣簡單:
PublicIDNumberAsInteger
可用下面兩個語句從其它模塊設置和返回Form1的IDNumber值:
Form1.IDNumber=3
Text1.Text=Form1.IDNumber
也可用Property過程向窗體添加自定義屬性。
詳細信息第九章“用對象編程”提供了Property過程的詳細材料。
注意不必加載窗體就可調用窗體的變量或自定義方法,還可設置窗體的自定義屬性。於是,不必將窗體加載到內存就可運行有關窗體的代碼。同樣,引用控件而不引用其屬性或方法時也不會加載窗體。
使用New關鍵字
用New關鍵字創建新對象,這個對象被視為它的類所定義的對象。可用New創建集合、窗體的實例以及類模塊中定義的類。
在窗體上使用New關鍵字
在設計時創建的窗體是類。可用New關鍵字創建這個類的新實例。為了看到這一工作過程,請在窗體上畫出一個命令按鈕和其它幾個控件。在“屬性”窗口中將窗體的Name屬性設置成Sample。在命令按鈕的Click事件過程中添加下列代碼:
DimxAsNewSample
x.Show
運行應用程序,並單擊命令按鈕數次。把最前面的窗體移到一邊。因為窗體是具有可視界面的類,所以可看到附加副本。每個窗體在相同位置上都有相同控件,而且這些位置也正是窗體在設計時的位置。
注意要使窗體變量和已加載窗體的實例一直存在,請用Static或Public變量,而不要用局部變量。
也可將New關鍵字與Set語句並用。請試用命令按鈕的Click事件過程中的代碼:
DimfAsForm1
Setf=NewForm1
f.Caption="hello"
f.Show
將New關鍵字和Set語句並用會加快運行速度,因此,這種方法值得推薦。
對其它對象使用New關鍵字
可用New關鍵字從類模塊中定義的類創建集合和對象。試用下例說明這一工作過程。
此例說明了New關鍵字是如何創建類的實例的。打開新工程,在Form1上畫出一個CommandButton控件。從“工程”菜單中選擇“添加類模塊”命令,從而在工程中添加一個類模塊。設置類模塊的Name屬性為ShowMe。
Form1中的下列代碼創建了類ShowMe的新實例,還調用了包含在類模塊中的過程。
PublicclsNewAsShowMe
PrivateSubCommand1_Click()
SetclsNew=NewShowMe
clsNew.ShowFrm
EndSub
類模塊中的ShowFrm過程創建類Form1的新實例,顯示窗體,然後使其最小化。
SubShowFrm()
DimfrmNewAsForm1
SetfrmNew=NewForm1
frmNew.Show
frmNew.WindowState=1
EndSub
為了應用這個例子,請運行應用程序並單擊命令按鈕數次。在創建ShowMe類的每一個新實例時將看到最小化的窗體圖標出現在桌面上。
詳細信息關於利用New創建對象的信息,請參閱第十章“用部件編程”。
New關鍵字的限制
下表說明不能用New關鍵字做什麼。
釋放對對象的引用
每個對象都使用內存和系統資源。當不再使用對象時及時釋放這些資源,這是良好的編程習慣。
用Unload從內存中卸載窗體或控件。
用Nothing釋放對象變量占用的資源。用Set語句將Nothing賦予對象變量。
詳細信息請參閱《VisualBasic6.0語言參考手冊》中的“Unload事件”和“Nothing”部分。
給過程傳遞對象
可在VisualBasic中將對象傳遞給過程。在下面的代碼例子中假定窗體中有一CommandButton控件:
PrivateSubCommand1_Click()
'調用Demo子過程,並將窗體傳遞給它。
DemoForm1
EndSub
PrivateSubDemo(xAsForm1)
'在屏幕中使窗體居中。
x.Left=(Screen.Width-x.Width)/2
EndSub
可以通過引用把對象傳遞給參數,然後在過程內將參數設置成新對象。為了看到這一工作過程,打開工程並插入第二個窗體。在每個窗體中安放一個圖片框。需要改變的屬性設置值如下表所示:
Form1_Click事件過程調用Form2中的GetPicture過程,並把一個空的圖片框傳遞給它。
PrivateSubForm_Click()
Form2.GetPicturePicture1
EndSub
Form2中的GetPicture過程把Form2上的圖片框的Picture屬性賦予Form1上的空圖片框。
PrivateobjXAsPictureBox
PublicSubGetPicture(xAsPictureBox)
'將傳遞進來的圖片框賦予對象變量。
SetobjX=x
'將Picture屬性值賦予Form1的圖片框。
objX.Picture=picture2.Picture
EndSub
為了應用這個例子,請運行程序並單擊Form1。在Form1的圖片框中將看到出現了Form2中的圖標。
詳細信息上述主題意在概述對象。更詳細內容,請參閱第九章“用對象編程”和第十章“用部件編程”。