創建對象
建立物件最簡單的方法是在「工具箱」中雙擊控制項。但是,對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中的圖示。
詳細資訊上述主題意在概述對象。更詳細內容,請參閱第九章「用物件程式設計」和第十章「用零件程式設計」。
->