四、自定義方法及其使用范圍


自定義方法及其使用范圍

雖然VB6中給我們提供了不少的子程序和函數,但在實際開發中,可能還是不能滿足我們的需要,於是就要我們自己創建一些來使用了,在VB6中,我們可以很容易的創建出自己的子程序和函數,現在就讓我們開始吧。

1 自定義函數

VB6中,使用Function關鍵字來創建函數,現在我們打開窗體Form1的代碼窗口,然后在左邊列表中選擇“通用”,這時輸入代碼的光標就會在所有其它代碼塊的外邊,我們就在這里開始編寫如下代碼:

Function IsLeapYear(iYear As Long) As Boolean

    IsLeapYear = ((iYear Mod 100 <> 0 And iYear Mod 4 = 0) Or (iYear Mod 100 = 0 And iYear Mod 400 = 0))

End Function

在這三行代碼中,我們使用Function來標明要創建的是一個函數,而End Function則指明了函數結束的位置,在這之間的則是函數體代碼。

跟在Function關鍵字后面的IsLeapYear則是我們所定義的函數的函數名,也就是在調用時要用到的名稱。在函數名后的括號中,則是函數的參數部分,這一部分在有些函數中可能沒有,但這時括號是不能省略的。

關於函數的參數,和在程序中定義變量是很相似的,即“參數名 As 類型”,如果有多個參數,則使用英文半房的逗號“,”分隔。

在括號的后面,As關鍵字后則是函數的返回值類型,在這里我們返回的則是一個布爾型。

關於這個函數,它的作用也許大家從名稱中就可以看出來了,沒錯,它就是用來判斷參數iYear所帶入的年份是不是一個閏年,也就是二月有29天,大家可以在一個按鈕的響應代碼中添加下面這句代碼來試試它的效果:

MsgBox (IsLeapYear(1904))

然后,你可以更改1904為任意數字,然后看看判斷的結果。當一個年份是閏年是則顯示True,如果不是則顯示False。

 

我們看到在函數體內只有一行代碼,這可以完成最基本的操作,在這行代碼中,我們使用了Mod運算符,它的運算結果將會是一個整數,是兩數相除后的余數,如果能被除盡,則返回0。在代碼中,如果一個年份不能被100整除,則能被4整除就是一個閏年;如果年份能被100整除,則只是在同時能被400整除時才是一個閏年。

在本行代碼中,還使用了And和Or運算符,它們被稱為邏輯運算符,下面分別說明一下:

And運算符,被稱為“與”運算符,只有在兩個運算量都是True或非0的數時,運算結果才是True,否則運算結果就是False。

Or運算符,又稱為“或”運算符,當運算的兩個量有一個是True或非0時,運算結果是True;其中兩個運算量都是False或都為0時,結果才是False。

 

在這里,我們還可以看到這一行代碼中使用了大量的運算符,有時它們連在一起形成很長的代碼,那它們又是如何來判斷執行的順序呢?其實,在每一種編程語言中都有有運算符的優先級原則,也就是不同運算符在一起時先執行誰的操作,后執行誰的操作。但實際應用中,想記清楚幾十個運算的優先級可能不是一個太容易的事情,所以我選擇了不去記它。在這里,如果不能對運算符的優級有十足的把握,我們還可以使用小括號強行更改代碼的運算順序,在代碼中我們可以看到使用了三對小括號,如果對兩個內層小括號中的代碼還不是太清楚的話,我們還可以加幾對小括號來強行控制,代碼可以改成:

Function IsLeapYear(iYear As Long) As Boolean

    IsLeapYear = (((iYear Mod 100 <> 0) And (iYear Mod 4 = 0)) Or ((iYear Mod 100 = 0) And (iYear Mod 400 = 0)))

End Function

 

到這里,如果你對它們的運算方法還不是很熟悉的話,可以暫時放一放,這樣長的代碼可以在實踐中逐漸掌握。

 

關於函數的定義,我們就先介紹到這里,在前面的學習中,我們已經知道子程序和函數最大的區別就是沒有返回值,下面我們看看它是怎么定義的。

 

2 自定義子程序

子程序的定義,我們使用Sub關鍵字,看一看下面這個子程序,它的功能是清除窗體Form1上所有文本框的內容:

Sub ClearText()

    Dim ctr As Control

    For Each ctr In Form1.Controls

        If TypeOf ctr Is TextBox Then ctr.Text = ""

    Next

End Sub

其中,Sub關鍵字后跟着的就是子程序的名稱ClearText;我們可以看到,這個子程序並沒參數,和函數一樣,當沒有參數時一對小括號也是不能省略的。也和函數相似,子程序是以End Sub來結束的。

  再來看一下方法體內的代碼吧,在這里我們定義了一變量ctr,它的類型是Control,然后我們使用For EachIn循環語句(為什么是這個語句而不是ForTo語句呢,當我們學習完面向對象后也許你就能明白了,在編碼中大家可以參照編寫)遍歷窗體Form1中所有的控件,當這個控件的類型是文本框時,則將它的Text屬性設置為空串,從而達到了清除所有文本框內容的目的;要注意的是,在這里TypeOf和Is是關鍵字。

再來看看這個If語句,好象沒有End If來結束,這是因為在條件成立時只有一條執行語句,這時我們就可將這一行執行語句寫在Then關鍵字的后面,從而省略和End If語句。

 

3 方法的使用范圍

在上面我們所定義的兩個方法IsLeapYear和ClearText,它們只能在Form1內部使用,ClearText到也沒什么,然而IsLeapYear有可能在很多處理日期的地方要用到,我們總不能每次都要編寫一次吧?

當然不用,只要在IsLeapYear定義的Function關鍵字前加上一個Public關鍵字就可以了,如:

Public Function IsLeapYear(iYear As Long) As Boolean

其它代碼則不用改變,然后,我們程序的其它地方就可以使用“Form1.IsLeapYear(2005)”這樣的形式來調用了,而這里如果將Public關鍵字改成“Private”則又只能在Form內使用了,這兩個關鍵字就決定了方法的使用范圍,我們會以后面學習中很多的接觸到它們的用法。

對於在程序中要公用的方法,如系統中提供的MsgBox函數、CStr函數,我們在窗體中定義它們當然是不太方便的,在后面我們還會學習到另外的大規模創建公用代碼的方法。

 

關於方法的定義,在這里要說明的是,函數或子程序只能單獨存在,而不能互相嵌套,也就是說在子程序或函數的代碼塊中不能定義其它的子程序和函數。

 

在前面我們使用了Dim變量來定義變量,如果要定義一個在整個程序中都要使用的變量,也可以在窗體的“通用”部分定義它,並且將Dim關鍵字改成Public關鍵字;這些變量只能定義在所有窗體方法的前面,這一點應該注意。

對於變量,Dim、Private和Public三種定義方式的不同在於:Dim只能在方法體內定義變量;Private定義的變量則只能在所定義的文件內使用,如窗體文件;而Public所定義的則是全局的變量,它可以使用在整個程序中使用。

在編程中,請大家注意變量和方法的使用范圍。

 

在下一章,我們將會來了解一下VB6中的錯誤處理。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com