ActiveX深入浅出(二)

Tibetgrammarb

Tibetgrammarb

2016-02-19 14:09

清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐ActiveX深入浅出(二),无聊中的都看过来。
事件是用来通知使用控件的程序员,某件事情发生了,好让程序员可以相应的处理。事件在VB编程中比比皆是,例如,当鼠标点击控件事会发生Click事件,文本框内容改变了会发生Change事件,等等。但这儿要讲的不同于这些东西,也不同于InitProperties,ReadProperties,WriteProperties前面提到过的事件,那些是系统已经定义好了的。我们要做的是定义自己的事件。自定义的事件必须声明在模块的声明部分,然后就能够在任何地方任何时候,只要你觉得应该有事件了,就可以触发它。例如,一个代表眨眼的事件应该这样声明:
  
  PublicEventBlink()
  
  在括号中,你可以放置任何你想要传递给事件的参数。对于一个Click事件,这个参数可能鼠标点击时x和y坐标。而这在理,应为只是眨眼,就用不到额外的参数了。
  
  触发事件,得使用RaiseEvent方法。对于我们的眨眼事件,我们把它和一个计时器联系起来,这样它就能够时不时的眨眼了:
  
  PrivateSubBlinker_Timer()
  
  RaiseEventBlink
  
  EndSub
  
  就这样,一个事件就完成了,没有任何技巧或者秘密可言。现在留给程序原作的,只要编写相应的事件处理过程就行了,就像下面这样:
  
  PrivateSubBodyControl1_Blink()
  
  Debug.Print"嘻嘻,我又眨眼了!"
  
  EndSub
  
  到这儿,大部分关于ActiveX控件的基本问题都讲了。后面的将是一些更高级的内容,包括图片和字体属性,“关于”对话框,运行时之读属性等等。在继续之前,再看看前面的内容,好好的在理解一下。好了吗?OK,现在开始更为激动的历程。
  
  首先,我们先来看看对于属性,还有什么可以挖掘的东西,比如颜色或者图片之类的东西。
  
  高级属性设计
  
  色彩值被存贮在长整形变量中,但是如果你只是定义一个长整形变量,显然是不能够得到像vb中所提供的那个颜色选单:
  
  这看起来很复杂,实际上做起来却一点也不难:所有你要做的只是把属性声明为OLE_COLOR类型,就像下面这段代码所作的那样:
  
  PublicPropertyGetBackColor()AsOLE_COLOR
  
  BackColor=UserControl.BackColor
  
  EndProperty
  
  PublicPropertyLetBackColor(ByValNew_BackColorAsOLE_COLOR)
  
  UserControl.BackColor=New_BackColor
  
  PropertyChanged"BackColor"
  
  EndProperty
  
  记得前面曾经提过除了Let,Get,还有第三种属性过程吗?现在揭开迷底:它就是Set属性过程,当要给对象变量赋值的时候,是不能用Let,而必须用Set来代替。这是因为保存在控件内部的对象变量,保存的并不是对象的拷贝,而只是对象的引用,也就是一个内存地址了。为了同一般变量的复制保存区别开来,VB引入了Set属性过程。
  
  或许你可能知道:字体和图片就是保存在对象中的,而且,它们都拥有各自的的对话框来设置相关属性。要用到这些对话框,所有我们要作的就是把图片或者字体申声明为Picture或者Font对象类型,并且为其设置Set属性过程。
  
  PublicPropertyGetFont()AsFont
  
  SetFont=lblText.Font
  
  EndProperty
  
  PublicPropertySetFont(ByValNew_FontAsFont)
  
  SetlblText.Font=New_Font
  
  PropertyChanged"Font"
  
  EndProperty
  
  看看上面的代码,你是不是在想:也没有什么很难的啊。确实,就是这样简单啊。下面,我们来看看如何为控键建立只读属性。这也是在控件的设计中用的比较多的一个内容。
  
  只读属性
  
  最简单的方法,就是不要在Let/Set属性过程中加入任何东西。但通常,这并不能满足要求,有时,你可能需要一个运行时只读的属性。所谓运行时——和设计时相对应,是指控件最终在一个开发完成的程序中运行,而设计时指的是控件被使用在开发程序的过程中。
  
  要实现运行时只读,要用到Usercontrol的AmbientProperties对象。它提供了很多关于控件容器的属性。中有一个UserMode属性,当控件处在运行时状态时,UserMode值为真。通过在Let/Get过程中提供对UserMode的检测,就可以很容易的实现运行是只读属性了:
  
  PublicPropertyGetMultiLine()AsBoolean
  
  MultiLine=m_MultiLine
  
  EndProperty
  
  PublicPropertyLetMultiLine(ByValNew_MultiLineAsBoolean)
  
  IfAmbient.UserModeThen
  
  Err.Raise382
  
  ExitSub
  
  EndIf
  
  m_MultiLine=New_MultiLine
  
  PropertyChanged"MultiLine"
  
  EndProperty
  
  这段代码保护属性只能够在设计时被修改,如果在运行时试图改变它,就会产生“Propertyisread-onlyatrun-time”错误。
  
  和AmbientProperties对象相近的还有Extender对象。对于Extender对象,在开始编写控件前有必要好好的了解。Extender对象是一个晚期绑定的借口,开发员可以通过它访问由控件容器(而不是控件本身)维护和控制的控件属性。它提供了一些属性,像Name,Enable,Left,Top,Height,Width等等,这些大多出现在一般的控件中,在编写控件属性前,应该看看是否已经存在在Extender对象中,一方面可以避免重复工作,另一方面也更有效率。
  
  但是使用Extender对象还存在一些问题:并不是所有的容器都支持访问相同的Extender属性。所以选用Extender对象是必须十分小心,否这做出的控件只能为特定的容器所使用。但如果你只是为VB开发控件,那就不用有这些顾虑了,尽量的用吧。
  
  还有一点要注意的是,Extender对象不能在usercontrol的initialize事件中访问它,但是可以在initProperties和ReadProperties事件中使用。
  
  枚举
  
  在控件中设置属性时,使用枚举是一种很常见的的方式。它提供了一个下拉列表和若干选项让你选择。这样方便了用户的操作,又不用考虑过多的兼容性和错误处理问题,简化了属性设置,而且更加安全。
  
  首先,必须建立一个枚举结构,放在声明部分。然后给出一系列的常量和对应的字符串。常量值可以零,或者是任何比它前面一个常量值大的整数。如果没有给出常量,那么VB自动为其赋值,第一个未指定的赋值为零,其它的值为前面一个数加一:
  
  PublicEnumeDirection
  
  Left
  
  Right=1
  
  Up
  
  Down
  
  EndEnum
  
  要实现枚举属性,必须创建一个带有Let和Get属性过程的标准属性。这里的技巧是将属性的类型声明为给出的枚举类型:
  
  PublicPropertyGetDirection()AseDirection
  
  Direction=m_Direction
  
  EndProperty
  
  PublicPropertyLetDirection(ByValNew_DirectionAseDirection)
  
  m_Direction=New_Direction
  
  PropertyChanged"Direction"
  
  EndProperty
  
  唯一要注意的是,只能够在设计时修改属性列表,而不允许在运行时这么做。其它的,像读,写,保存和检索,都和使用标准属性是一样的。
  
  这就是所有的技巧了。难以置信的简单,是吗?你的控件是不是看起来更为专业了呢?
  
  Usercontrol对象
  
  用VisualBasic所创建的ActiveX控件总是由UserControl对象加上选中放到UserControl上的任何控件(称为子控件或则组成控件)所组成。就象VisualBasic窗体一样,UserControl对象具有代码模块以及可视化的设计器。将组成控件放到UserControl对象的设计器上,就象把控件放到窗体上一
展开更多 50%)
分享

猜你喜欢

ActiveX深入浅出(二)

Web开发
ActiveX深入浅出(二)

深入浅出 CPropertySheet

C语言教程 C语言函数
深入浅出 CPropertySheet

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Singleton深入浅出

电脑网络
Singleton深入浅出

C#深入浅出全接触(二)

编程语言 网络编程
C#深入浅出全接触(二)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

网页制作深入浅出

Web开发
网页制作深入浅出

深入浅出谈防火墙

电脑网络
深入浅出谈防火墙

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

如何用Excel控件制作简单报表

如何用Excel控件制作简单报表

ajax跨域问题的实例

ajax跨域问题的实例
下拉加载更多内容 ↓