ActiveX深入淺出(二)

來源:互聯網
上載者:User
active|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屬性過程的標準屬性。這裡的技巧是將屬性的型別宣告為給出的枚舉類型:

   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 對象的設計器上,就象把控制項放到表單上一



相關文章

Alibaba Cloud 10 Year Anniversary

With You, We are Shaping a Digital World, 2009-2019

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。