- Login
帳號:
密碼:
ASP MENU
線上教學
   ASP 教學
VB.NET 教學
JSP 教學
JAVA 教學
完整 ASP 教學
程式下載
   ASP 程式下載
提供 ASP 程式
程式量身訂做
   收費標準
填寫需求表
討論交流專區
   程式討論區
電腦資訊交流
工作機會
   社會人就職情報
汎亞人力銀行
大台中人力銀行
大高雄人力銀行
相關連結
   ASP 虛擬空間
ASP 相關網站
聯絡我們
   意見信箱
加入會員程式討論區線上購物回首頁
ASP 教學
ActiveX深入淺出(二)
What an Event

   事件是用來通知使用控件的程序員,某件事情發生了,好讓程序員可以相應的處理。事件在VB編程中比比皆是,例如,當鼠標點擊控件事會發生Click事件,文本框內容改變了會發生Change事件,等等。但這兒要講的不同於這些東西,也不同於InitProperties, ReadProperties, WriteProperties前面提到過的事件,那些是系統已經定義好了的。我們要做的是定義自己的事件。自定義的事件必須聲明在模塊的聲明部分,然後就能夠在任何地方任何時候,只要你覺得應該有事件了,就可以觸發它。例如,一個代表眨眼的事件應該這樣聲明:

   Public Event Blink()

   在括號中,你可以放置任何你想要傳遞給事件的參數。對於一個Click事件,這個參數可能鼠標點擊時x和y坐標。而這在理,應為只是眨眼,就用不到額外的參數了。

   觸發事件,得使用RaiseEvent方法。對於我們的眨眼事件,我們把它和一個計時器聯繫起來,這樣它就能夠時不時的眨眼了:

   Private Sub Blinker_Timer()

   RaiseEvent Blink

   End Sub

   就這樣,一個事件就完成了,沒有任何技巧或者秘密可言。現在留給程序原作的,只要編寫相應的事件處理過程就行了,就像下面這樣:

   Private Sub BodyControl1_Blink()

   Debug.Print "嘻嘻,我又眨眼了!"

   End Sub

   到這兒,大部分關於ActiveX控件的基本問題都講了。後面的將是一些更高級的內容,包括圖片和字體屬性,“關於”對話框,運行時之讀屬性等等。在繼續之前,再看看前面的內容,好好的在理解一下。好了嗎?OK,現在開始更為激動的曆程。

   首先,我們先來看看對於屬性,還有什麼可以挖掘的東西,比如顏色或者圖片之類的東西。

   高級屬性設計

   色彩值被存貯在長整形變量中,但是如果你只是定義一個長整形變量,顯然是不能夠得到像vb中所提供的那個顏色選單:

   這看起來很複雜,實際上做起來卻一點也不難:所有你要做的只是把屬性聲明為OLE_COLOR類型,就像下面這段代碼所作的那樣:

   Public Property Get BackColor() As OLE_COLOR

   BackColor = UserControl.BackColor

   End Property

   Public Property Let BackColor(ByVal New_BackColor As OLE_COLOR)

   UserControl.BackColor = New_BackColor

   PropertyChanged "BackColor"

   End Property

   記得前面曾經提過除了Let,Get,還有第三種屬性過程嗎?現在揭開迷底:它就是Set屬性過程,當要給對象變量賦值的時候,是不能用Let,而必須用Set來代替。這是因為保存在控件內部的對象變量,保存的並不是對象的拷貝,而只是對象的引用,也就是一個內存地址了。為了同一般變量的復制保存區別開來,VB引入了Set屬性過程。

   或許你可能知道:字體和圖片就是保存在對象中的,而且,它們都擁有各自的的對話框來設置相關屬性。要用到這些對話框,所有我們要作的就是把圖片或者字體申聲明為Picture或者Font對象類型,並且為其設置Set屬性過程。

   Public Property Get Font() As Font

   Set Font = lblText.Font

   End Property

   Public Property Set Font(ByVal New_Font As Font)

   Set lblText.Font = New_Font

   PropertyChanged "Font"

   End Property

   看看上面的代碼,你是不是在想:也沒有什麼很難的啊。確實,就是這樣簡單啊。下面,我們來看看如何為控鍵建立只讀屬性。這也是在控件的設計中用的比較多的一個內容。

   只讀屬性

   最簡單的方法,就是不要在Let/Set屬性過程中加入任何東西。但通常,這並不能滿足要求,有時,你可能需要一個運行時只讀的屬性。所謂運行時????和設計時相對應,是指控件最終在一個開發完成的程序中運行,而設計時指的是控件被使用在開發程序的過程中。

   要實現運行時只讀,要用到Usercontrol的AmbientProperties對象。它提供了很多關於控件容器的屬性。中有一個UserMode屬性,當控件處在運行時狀態時,UserMode值為真。通過在Let/Get過程中提供對UserMode的檢測,就可以很容易的實現運行是只讀屬性了:

   Public Property Get MultiLine() As Boolean

   MultiLine = m_MultiLine

   End Property

   Public Property Let MultiLine(ByVal New_MultiLine As Boolean)

   If Ambient.UserMode Then

   Err.Raise 382

   Exit Sub

   EndIf

   m_MultiLine = New_MultiLine

   PropertyChanged "MultiLine"

   End Property

   這段代碼保護屬性只能夠在設計時被修改,如果在運行時試圖改變它, 就會產生“Property is read-only at run-time”錯誤。

   和AmbientProperties對象相近的還有Extender對象。對於Extender對象,在開始編寫控件前有必要好好的了解。Extender對象是一個晚期綁定的借口,開發員可以通過它訪問由控件容器(而不是控件本身)維護和控制的控件屬性。它提供了一些屬性,像Name,Enable,Left,Top,Height,Width等等,這些大多出現在一般的控件中,在編寫控件屬性前,應該看看是否已經存在在Extender對象中,一方面可以避免重複工作,另一方面也更有效率。

   但是使用Extender對象還存在一些問題:並不是所有的容器都支持訪問相同的Extender屬性。所以選用Extender對象是必須十分小心,否這做出的控件只能為特定的容器所使用。但如果你只是為VB開發控件,那就不用有這些顧慮了,盡量的用吧。

   還有一點要注意的是,Extender對象不能在usercontrol的initialize事件中訪問它,但是可以在initProperties和ReadProperties事件中使用。

   枚舉

   在控件中設置屬性時,使用枚舉是一種很常見的的方式。它提供了一個下拉列表和若干選項讓你選擇。這樣方便了用戶的操作,又不用考慮過多的兼容性和錯誤處理問題,簡化了屬性設置,而且更加安全。

   首先,必須建立一個枚舉結構,放在聲明部分。然後給出一系列的常量和對應的字符串。常量值可以零,或者是任何比它前面一個常量值大的整數。如果沒有給出常量,那麼VB自動為其賦值,第一個未指定的賦值為零,其它的值為前面一個數加一:

   Public Enum eDirection

   Left

   Right = 1

   Up

   Down

   End Enum

   要實現枚舉屬性,必須創建一個帶有Let和Get屬性過程的標準屬性。這堛漣犍帕O將屬性的類型聲明為給出的枚舉類型:

   Public Property Get Direction() As eDirection

   Direction = m_Direction

   End Property

   Public Property Let Direction(ByVal New_Direction As eDirection)

   m_Direction = New_Direction

   PropertyChanged "Direction"

   End Property

   唯一要注意的是,只能夠在設計時修改屬性列表,而不允許在運行時這麼做。其它的,像讀,寫,保存和檢索,都和使用標準屬性是一樣的。

   這就是所有的技巧了。難以置信的簡單,是嗎?你的控件是不是看起來更為專業了呢?

   Usercontrol對象

   用 Visual Basic 所創建的 ActiveX 控件總是由 UserControl 對象加上選中放到 UserControl 上的任何控件(稱為子控件或則組成控件)所組成。就象 Visual Basic 窗體一樣,UserControl 對象具有代碼模塊以及可視化的設計器。將組成控件放到 UserControl 對象的設計器上,就象把控件放到窗體上一樣。 在窗體上放置 ActiveX 控件的實例時,就創建了 UserControl 對象,以及放在 UserControl 設計器上的所有子控件的實例。這些對象都被封裝在控件中。

   UserControl 對象有自己的屬性、方法和事件。對於一些屬性,像BorderStyle,BackColor等等,與其自己寫代碼來實現 BackColor 屬性,不如就直接使用UserControl對象的。這就意味著 ActiveX 控件的 BackColor 屬性只需要簡單地調用 UserControl 對象的 BackColor 屬性就行了。同樣地,也可以在UserControl 對象現有的 Click 事件的基礎上設計您的控件的 Click 事件。

   事實上在前面的內容中,我們時時都在和這個對象打交道,但是它有一些特別的東西,是應該值的多一些注意的。它的大部分屬性應該在控件的設計時來完成設置。在這兒我解釋一些比較晦澀難懂得屬性的含義,還有一些一望既知,就不多費口舌了。

   Alignable屬性,當被設置成真的時候,VB將自動為控件添加一個新的屬性:align。這樣就能夠像放置工具條那樣安排控件在容器中的位置,而且這還意味著你的控件能夠被放置在MDI程序中。

   CanGetFocus屬性,能夠決定用戶控件是否能夠在運行時獲得焦點。當要創建一個圖形控件,或者像Timer那樣在運行是不可見的控件時,就要設置這個值為False。要注意的是:只要控件至少包含一個設置為能夠接收焦點的子控件,CanGetFocus 屬性就不能設置為 False。如果 CanGetFocus 設置為 False,則其所有的子控件都不能設置為接收焦點。

   ControlContainer屬性定義一個控件是否能夠像frames或者PictureBoxes控件那樣作為控件容器包含其它的控件。

   DefaultCancel 屬性可以為控件添加Default和 Cancel屬性。在添加 Default 和 Cancel 屬性後,控件就可充當標準命令按鈕。也就是說當Default被設為Ture後,按下回車鍵會觸發控件的click事件,而當Cancel屬性被設為Ture時,Esc鍵按下也會觸發click事件。

   你可以通過檢查AmbientProperties對象的DisplayAsDefault屬性來知道控件是不是缺省控件。

   InvisibleAtRuntime能夠讓你建立像Timer之類的控件,在運行的時候是不可見的。

   最後,ToolboxBitmap 屬性用來指定放在VB工具箱上的圖標的。微軟建議的大小是32x32,但是實踐證明23x23或24x24工作起來更好,32x32是被縮放到那麼大了再顯示出來的。

   屬性的屬性

   說起來有點繞口,也有點費解,是嗎?。VB允許為控件的每個成員設置屬性。這媊悒]含了一些較高級的內容,能夠讓你建造更為專業化的控件。在菜單欄中點擊工具|過程屬性,會出現下面的對話框:

   你可以在描敘框內輸入一段對控件的說明,在幫助上下文標識符內輸入一個幫助的關聯ID號,將你的控件與一個幫助文件關聯起來,這樣當點了屬性後再按F1鍵就可以給出這個屬性的幫助內容。

   利用“在屬性瀏覽其中使用本頁”字段,可以給控件的定制屬性頁分配選定的號碼。這樣當用戶從VB的屬性瀏覽器中選擇該成員時,VB將直接線是屬性頁。 “屬性分類”字段能夠讓屬性在VB的屬性瀏覽器的“按分類序”模式中出現在特定的類別下。這些類別包括外觀,字體,位置,雜項等等,只要選擇一項就行了。“隱藏該成員”可以讓屬性不在屬性瀏覽器中顯示出來,這對於一些不想讓用戶看到得公有成員有用,但是要記住,它只是隱藏而不是不許被使用。而利用“在屬性瀏覽器中不顯示”可以在控件的設計時(而不是在運行時)把屬性從屬性瀏覽器中去掉。作為一般的原則,任何用ReadProperties和WriteProperties實現的永久的屬性,都應當被屬性瀏覽器顯示出來,反之,任何非永久性的屬性就不應被顯露出來。

   “缺省用戶界面”用來設置控鍵的缺省屬性和方法。比如,因為Caption屬性是Lable控鍵的缺省屬性,那麼就可以對代碼進行一些簡化,把

   Label1.Caption = "Hello"

   可以簡寫為:

   Label1 = "Hello"

   最後是關於數據綁定的部分。在VB中,數據庫的應用是很常見的。利用MS的數據訪問功能,可以很容易的把控件屬性和數據庫的字段聯繫起來。當選擇了“屬性為數據綁定”和“綁定屬性到數據字段”兩個復選框後,該屬性就可以以標準綁定控鍵的方式運行,這意味著你可以在為該屬性選擇數據庫控件和字段名稱。

   最後的話

   到這兒,幾乎大部分和用戶控件有關的內容都講完了。你現在就可以開始為自己的程序定制合適的控件,還可以讓別人分享你的成果。雖然內容不是很多,但要完全吃透也不是件容易的事。所以,多看多練還是必要的,學無止境嘛。

   當然,沒有十全十美的東西,對於ActiveX控件也是這樣的。合理的使用用戶控件是必須要注意的事情。ActiveX控件很容易就會變得很複雜,一不小心的話,你所付出的會遠遠多於你所得到的。

   如果你只是想要一個帶有屬性和方法的對象,那麼類或許是更好的選擇。用戶控件與應用程序間相對複雜的接口,會佔用較多的資源。而在編程方面,控件也要比類複雜一些。但是如果你要求屬性,方法和事件實現永久的數據存貯,後者要在程序的外部實現組件更新,那麼就要用到用戶控件了。總之,不要以為這是一件容易的是。雖然我在這兒講得很簡單,但是對一個完整的用戶控件的設計,編寫,以及測試和調試所作的工作,絕對不會比一個一般的VB應用程序來的少。



頂端
本網頁最佳瀏覽模式為:瀏覽器 IE4.0 以上    解析度: 800 x 600
Copyright © 2000-2020 COOLASP All Rights Reserved