当前位置:编程学习 > asp >>

ActiveX深入浅出(二)

答案:    
  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对象
 &nb

上一个:制作我们自己的Ebay(拍卖系统EN) - Conclusions - Page 9
下一个:ActiveX深入浅出(一)

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,