财经热点 > 财经资讯 > ActiveX深入浅出(二)
【Event】ActiveX深入浅出(二)
信息来源】   发布日期:5-8 10:30:00    文章分类:财经资讯   
专题:Event】 【Change】 【Blink】 【Control】 【运行时】 【读属性】 【Set属性过程】 【Font】 【进程中】 【设计时】 【Ambient】 【Raise】 【会发生
   What an Event

   事件是用来通知使用控件的程序员,某件事情发生了,好让程序员可以相应的处理。事件在VB编程中比比皆是,例如,当鼠标点击控件事会发生Click事件,文本框内容改变了会发生Change事件,...。但这儿要讲的不同于这些东西,也不同于InitProperties, ReadProperties, WriteProperties前面提到过的事情,那些是系统已经定义好了的。我们要做的是定义自己的事情。自定义的事情务必声明在模块的声明部分,而后就能够在任何地方任何时候,只要你觉得应该有事件了,就可以触发它。例如,一个代表眨眼的事情应该这样声明:

   Public Event Blink()

   在括号中,你可以放置任何你想要传递给事件的参数。对于一个Click事件,这个参数可能鼠标点击时x和y坐标。而这在理,应为只是眨眼,就用不到额外的参数了。

   触发事件,得使用RaiseEvent方法。对于我们的眨眼事件,我们把它和一个计时器联系起来,这样它就能够时不时的眨眼了:

   Private Sub Blinker_Timer()

   RaiseEvent Blink

   End Sub

   就这样,一个事件就完成了,没有任何技巧或秘密可言。现在留给程序原作的,只要编写相应的事情处理过程就OK了,就像下面这样:

   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 对象的设计器上,就象把控件放到窗体上一

手机扫码浏览该文章
 ● 相关资讯推荐
 ● 相关资讯专题