1、第8章 ActiveX部件编程,绊顿纶锨喊援赊叶披衫晨搽识薄九显店臣贱到歌蚜蛤趣财坊故轻文辗顷搀第八章 ActiveX部件编程第八章 ActiveX部件编程,ActiveX部件是包含可执行代码的文件,由一个 或多个对象构成。 ActiveX部件提供的对象可以被 其它应用程序或部件使用。 8.1 概述ActiveX的基础是COM(Component Object Model)。COM不是一种语言,而是一种能使软部件作为一种对象进行相互作用的二进制标准。ActiveX是基于COM的可视化控件结构的商标名称,是一种封装技术。在VB中,可以使用各种类型的ActiveX部件,如ActiveX控件和代码部
2、件等。也可以在VB应用程序内部通过编程来操纵支持ActiveX技术的应用程序所提供的对象,如Excel电子表格、Word文档等。可以创建自己的ActiveX部件。可以创建的类型包括:代码部件、 ActiveX控件、 ActiveX文档。,掂幢编光搏衰卜昔注渍巍尿耳恢锚谬如垄蹦滑愧赃收卸陡往码冬斗癌苦更第八章 ActiveX部件编程第八章 ActiveX部件编程,例、ActiveX功能举例。利用自动机制在VB中为Word 文档编写一些文本。该例题要求机器内装了Word。编程前先添加对“Microsoft Word 8.0 Object Library”部件的引用。(若安装的OfficeXP,则为
3、Microsoft Word 10.0 Object Library;若按装的是Office2003 则为Microsoft Word 10.0 Object Library Microsoft Word 11.0 Object Library )在窗体上创建一个带滚动条的多行文本框txtinput、一个命令按钮cmdwrite。 程序如下: Option Explicit Dim mword As Word.ApplicationPrivate Sub Form_Initialize()Set mword = New Word.Application End Sub,柯榜浦宰辛道勉顷叁蛀废坚
4、啡霹遵糖铁逐诣梦泌卖几乏习少血唆笨十丙趋第八章 ActiveX部件编程第八章 ActiveX部件编程,Private Sub cmdwrite_Click()cmdwrite.Enabled = FalseCall mword.Documents.Addmword.Selection.Font.Size = 30mword.Selection.Font.Name = “Times New Roman“Call mword.Selection.TypeText(txtinput.Text)Call mword.Documents(1).SaveAs(app.path+“word.doc“)Cal
5、l mword.Quit End Sub,儒稍午燥耐伦鄙岿雇额含勤害杏忱裂庇鹤容激闺陈泉屹珍宰戌市担横漳捅第八章 ActiveX部件编程第八章 ActiveX部件编程,8.2 ActiveX部件的使用使用ActiveX部件的步骤: 创建对要使用的对象的引用, 将一个对象引用赋值给变量, 编写代码来使用对象的方法、属性和事件, 使用完后释放对象, 创建错误处理程序。部件对象引用如何赋值取决于两个因素:1、部件是否提供类型库。如刚才例题中引用的“Microsoft Word 11.0 Object Library”。类型库含有ActiveX部件提供的全部对象的定义以及全部可用的方法、属性和事件的定
6、义。2、对象是顶层对象、外部可创建对象还是从属对象。如果是外部可创建对象,则可以在Set语句中用New关键字、CreateObject或GetObject函数从部件外面将对象引用赋予变量。如果是从属对象,则需要使用高层对象的方法在Set语句中指定一个对象引用。,蠕量舞亿腕风仇岗掸婪驹彭橇殃境玩哮冰次虑凯缸惹笨迸志糊骚奋腿鸳挂第八章 ActiveX部件编程第八章 ActiveX部件编程,8.2.1 添加对部件的引用如果ActiveX部件提供有类型库,则必须添加对部件的引用。 8.2.2 声明对象变量使用ActiveX部件对象之前,首先要声明一个对象变量。声明方法取决于ActiveX部件是否提供类
7、型库。 如果提供类型库,则: Dim variable as new class 参数class的格式是appname.objecttype,例如:Dim xlBook As Excel.WorkbookDim xlBook As Excel.Worksheet 如果ActiveX部件不提供类型库或对象未在类型库中定义,则使用一般的Object类的对象变量。例如:Dim objAny As ObjectobjAny可以被ActiveX部件提供的任何对象所使用。,凳织匣霓叁训晋繁家吸股马键瓮亭目俞帘馏沛咏毯登投琳茨脊汇之翌扭灾第八章 ActiveX部件编程第八章 ActiveX部件编程,8.2.
8、3 将对象引用赋予变量声明对象引用之后,接着要给变量赋值对象引用。赋值方法有三种: 1、用New关键字声明对象变量。第一次使用对象变量时,自动创建一个新对象。 2、用CreateObject函数在Set语句中赋值对一个新对象的引用。书P248 3、用GetObject函数Set语句中赋值对新的或已有对象的引用。书P249,靡嫁模蜕阿厨统缩挂辈袁败梨附般葛拉乌敞糖厌考读珠蔓渠奏誓拟归讶兰第八章 ActiveX部件编程第八章 ActiveX部件编程,8.2.4 使用对象的属性、方法和事件 1、使用对象的属性和方法 书P250 2、响应对象的事件 书P250可以响应ActiveX部件对象所引发的事件
9、。但由部件提供的对象的事件在VB应用程序中不是自动可用的,必须在声明一个对象变量时使用WithEvents关键字。8.2.5 释放对象使用完对象后,要清除所有引用该对象的变量,以从内存中释放对象。Set Objectname=nothing,细刨力邪雄径弯娄紊薛档砚闷称养瞧花明心角度纺救呻共捌橇蹲匡搐智紧第八章 ActiveX部件编程第八章 ActiveX部件编程,8.2.6 部件对象的层次结构ActiveX部件提供的对象是以层次结构来组织的。 层次结构使对象可能包含其他对象。这种包含是通过集合来实现的。层次结构中的对象如何访问,取决于对象是外部可创建的,还是从属对象。如果是外部可创建对象,则
10、直接访问;如果是从属对象,则间接访问。大多数部件还可使用Parent和Application属性向上定位。,柄诌褂古成糟蓖溅谓掇圆续增琵壕伶臣脚曼柒折集撂坯忙哼亨逐担尉肮磋第八章 ActiveX部件编程第八章 ActiveX部件编程,1、外部可创建对象大多数ActiveX部件的对象层次都提供有一个顶层外部可创建对象。在应用程序中,通过在Set语句中使用New关键字、CreateObject或GetObject直接赋值引用。通过创建顶层对象的对象引用,可以访问每个从属对象,以及从属对象的属性和方法。此外,顶层对象还提供对整个部件都起作用的方法和属性。 2、从属对象从属对象位于对象层次中的较低层,
11、只能通过使用外部可创建对象的属性和方法被访问。,崖露肛立甸睛滔犀轮牢崇碍弛逼爹评敬沫爷稠狼蜘摩窟跟稿络莹嚼地皮颖第八章 ActiveX部件编程第八章 ActiveX部件编程,8.2.7错误处理使用ActiveX部件时,任何可能产生错误的地方,都要有相应的错误处理例程。书P255例8.1,庄如碟请退探疫盟抠么标们较菏腹酸谜逗殃嫌峦针洲姿偶涨西檀舜儡睡峭第八章 ActiveX部件编程第八章 ActiveX部件编程,8.3 OLE容器控件如果部件支持OLE,则使用部件的可视界面不需编写任何代码就可以将对象插入到应用程序中。插入方法有两种:“工程”菜单中“部件”命令,“可插入对象”选项卡中所列对象,选
12、中后就添加到工具箱中,然后可以在窗体中直接利用;在窗体中添加OLE容器控件,然后插入对象。OLE容器控件为使用部件的可视界面提供了极大的灵活性。任何时刻,每个OLE容器控件内只能有一个对象。在OLE容器控件中插入对象有三种方法:使用“插入对象”或“选择性粘贴”对话框;调用CreateEmbed或CreateLink方法;在属性窗口种设置Class、SourceDoc和SourceItem属性。8.3.1 链接对象与嵌入对象链接与嵌入是使用OLE容器控件插入对象的两种方式。链接与嵌入的不同在于存储数据的方式不同。书P257,瞪势饰叙匈过水泪融衍摈卜颊臆肥酸殆舒铭交曰摧腊销须闸地鹊救唱刹拭第八章
13、ActiveX部件编程第八章 ActiveX部件编程,8.3.2 设计时创建OLE对象 书P258 8.3.3 运行时创建OLE对象 书P259 8.3.4 InsertObjDlg与PasteSpecialDlg方法 书P260 8.3.5 将数据库与OLE容器控件绑定 8.3.6 激活OLE容器控件中的对象1、DoVerb方法2、AppIsRunning属性3、AutoActivate属性 8.3.7 确定在OLE容器控件中如何显示对象1、DisplayType属性2、SizeMode属性 8.3.8 ObjectMove事件 8.3.9 保存和检索嵌入对象中的数据 8.3.10 Upda
14、ted事件,哉溢眠愤徽嚏先循霄衅倪庞际睛讯舒社婉激炉呛拓因历躯间靖腋笨坤画笑第八章 ActiveX部件编程第八章 ActiveX部件编程,8.4 ActiveX控件的创建 8.4.1 概述 书P2641、控件类与控件实例2、控件与控件部件3、容器与定位4、接口与外观5、制作者与开发者6、设计时实例与运行时实例7、UserControl对象 8、建造方式9、UserControl对象的关键事件 8.4.2 创建ActiveX控件1、创建一个动画时钟控件 书P265 2、创建一个带指示的滚动条控件,渣触它焰吝戏怔仕比卖曾磕游妖壬姨锣缩兔痕底会论绩庶绑束迭孺冻叼叠第八章 ActiveX部件编程第八章
15、 ActiveX部件编程,例2、创建一个带指示的滚动条控件各控件属性设置 对象 属性 属性值 UserControl Name LabelScrollbarScaleMode 3pixelScaleHeight 18ScaleWidth 242 Label Name lbldisplayCaption 空Height 17Width 41 Scrollbar Name hsbscrollHeight 17Width 193,颁喇钥锐衔砖立淬谎乒登翅淡兰廷娃瘩怂慰颁蜜约哭头鄂瘩符蕾儒族钥搓第八章 ActiveX部件编程第八章 ActiveX部件编程,Option Explicit Public
16、Event change() labelscrollbar控件的Change事件,由滚动条触发Private Sub hsbscroll_Change()lbldisplay.Caption = hsbscroll.value构造控件的事件默认隐藏在UserControl中,开发者不能直接使用,必须由代码激活RaiseEvent change End Sub 每当在容器上放置用户控件的新实例时,InitProperties初始化了用户控件的属性 Private Sub UserControl_InitProperties()With hsbscroll.min = 0.max = 32767.
17、value = (min + max) / 2.smallchange = 1.largechange = 5End Withlbldisplay.Caption = hsbscroll.value End Sub,屠柏嫁拯娘窝秒嘉勘叼郁卯俩绚礁斜沫匹十韵债玖扶搭佬炬饭羽荫抖婿晒第八章 ActiveX部件编程第八章 ActiveX部件编程,如果控件不是一个新实例(如打开一个包含LabelScrollbar的窗体),则调用ReadProperties来设置控件的属性。 ReadProperties只接受一个PropertyBag类型的参数。PropertyBag对象(即PropBag)使得Rea
18、dProperties控件的状态可以取出(如可以从一个.frm文件中读取)。PropBag的ReadProperty方法读取一个属性,第一个参数表示UserControl的属性名字符串,第二个参数指明了其默认值(如果属性没有保存值则使用这个值)Private Sub UserControl_ReadProperties(PropBag As PropertyBag)With hsbscroll.value = PropBag.ReadProperty(“Value“, (min + max) 2).min = PropBag.ReadProperty(“Min“, 0).max = PropB
19、ag.ReadProperty(“Max“, 32767).largechange = PropBag.ReadProperty(“LargeChange“, 5).smallchange = PropBag.ReadProperty(“SmallChange“, 1)End Withlbldisplay.Caption = PropBag.ReadProperty(“Caption“, (min + max) 2) End Sub,柏琢购迅狠早怒沼住深咬赘广冯纵胜莫假枣黔尸迷经煎咱诡豁窥孺从长褐第八章 ActiveX部件编程第八章 ActiveX部件编程,当删除设计期间的控件实例时,利用Wr
20、iteProperties来保持属性值(保存在磁盘中)。 WriteProperties事件过程接受一个PropertyBag参数(用来保存控件的状态)。 WriteProperty方法向磁盘写入一个属性值。第一个参数为属性名字符串,第二个参数为要保存的值,第三个参数为一个默认值(只有不同于默认值时才写入新值)。Private Sub UserControl_WriteProperties(PropBag As PropertyBag)Call PropBag.WriteProperty(“Value“, hsbscroll.value, (min + max) 2)Call PropBag.
21、WriteProperty(“Caption“, hsbscroll.value, (min + max) 2)Call PropBag.WriteProperty(“Min“, hsbscroll.min, 0)Call PropBag.WriteProperty(“Max“, hsbscroll.max, 32767)Call PropBag.WriteProperty(“SmallChange“, _hsbscroll.smallchange, 1)Call PropBag.WriteProperty(“LangeChange“, _hsbscroll.largechange, 5) E
22、nd Sub,嚼幌氰房播刹色尊斋渐庆癌皂马熬翼疤枚啸祁附帮映胳辽鞠福忠即氰寄肩第八章 ActiveX部件编程第八章 ActiveX部件编程,当放置控件或开发者重新调整控件大小时,Resize事件中包含了指明构造控件应如何定义自己的大小。Private Sub UserControl_Resize()With hsbscroll.Left = lbldisplay.Width.Width = ScaleWidth - hsbscroll.Left.Height = ScaleHeightEnd Withlbldisplay.Height = ScaleHeight End Sub 设置控件属性,
23、Get过程只是返回这五个属性的当前值,Let过程设置这五个属性值。Let中的调用UserControl的PropertyChange方法,以通知UserControl的容器已经改变了一个属性值。同时也允许使用新值更新属性窗口,并激活WriteProperties事件。 Public Property Get value() As Longvalue = hsbscroll.value End PropertyPublic Property Let value(ByVal v As Long)hsbscroll.value = vCall UserControl.PropertyChanged(
24、“Value“) End Property,烛股欣雀老电鞘元刻幽榴吴堂装圈曹姻窍郁宰住离受景癣帝厄但丛淌绞陕第八章 ActiveX部件编程第八章 ActiveX部件编程,Public Property Get max() As Integermax = hsbscroll.max End PropertyPublic Property Let max(ByVal m As Integer)hsbscroll.max = mCall UserControl.PropertyChanged(“Max“) End PropertyPublic Property Get min() As Intege
25、rmin = hsbscroll.min End PropertyPublic Property Let min(ByVal m As Integer)hsbscroll.min = mCall UserControl.PropertyChanged(“Min“) End Property,裂亦仪感偶渴咙报帮劫陨谩咸柯肺乖茎蒋吴蝗休瞅免虱能列矗垄彬忧榜溅第八章 ActiveX部件编程第八章 ActiveX部件编程,Public Property Get largechange() As Integerlargechange = hsbscroll.largechange End Propert
26、yPublic Property Let largechange(ByVal c As Integer)hsbscroll.largechange = cCall UserControl.PropertyChanged(“LargeChange“) End PropertyPublic Property Get smallchange() As Integersmallchange = hsbscroll.smallchange End PropertyPublic Property Let smallchange(ByVal c As Integer)hsbscroll.smallchang
27、e = cCall UserControl.PropertyChanged(“SmallChange“) End Property,酿挚序乱纬滚细登梳毗狠沼滋瑚碌阴燃四沽晌鲸绊偏女瞧骚右框匀骄扔吃第八章 ActiveX部件编程第八章 ActiveX部件编程,ActiveX控件的生存期和事件:双击一个工具箱图标(如ImageCombo ActiveX控件),可以创建控件的一个实例(设计时的实例),并且在容器(如窗体)中放置这个控件。如果放慢这一过程,我们可以了解到以下内容: 1、双击工具箱按钮创建了控件的一个实例; 2、创建了构造控件(ActiveX可能包含的其他控件); 3、创建UserCon
28、trol对象(控件实例),触发UserControl_Initialize事件。(在控件的生存期里只执行一次Initialize,它是第一个被执行的事件) 4、当控件实例首次放置到容器上时,触发UserControl_InitProperties事件。该事件将控件的属性初始化为它们的默认值。(在控件的生存期里只被执行一次)。,欣瞎洪踢碉屠舍曰剁驾窿弦陪弧辅眉良荧薛絮毫惋讽仅畜芭盼祈乒淘免璃第八章 ActiveX部件编程第八章 ActiveX部件编程,当打开一个已经包含控件实例的已有窗体,则不执行InitProperties,而是执行UserControl_ReadProperties。Read
29、Properties取出保存的属性值。 5、接着触发UserControl_Resize事件来设置控件的大小。构造控件使用Resize来确定每一控件成员的布局和大小; 6、触发Show和Paint事件。现在控件是可见的了。(此时,开发者就可以为控件展现的各种事件编写代码,使用其方法和属性。然后,程序开始执行)7、程序运行关闭设计器时,ActiveX控件触发UserControl_WriteProperties,保存设计期间的属性设置。将属性写为窗体文件(.frm)的一个副本(在内存中)。保存这个工程,更新磁盘上的.frm文件以反映属性的变化。(不保存工程则不修改.frm文件) 8、接下来从容器
30、中删除控件,触发UserControl_Terminate事件,微芯玫蓉宣椭意拎年憎技兆邀芹警丫铀柄疫准肆请矾君捂戴罐低车糜绳皋第八章 ActiveX部件编程第八章 ActiveX部件编程,9、删除UserControl对象和所有的构造控件。(这标志着设计模式的实例容器和实例控件的结束。在程序运行期间,将创建容器与控件的运行实例)10、调用Initialize。创建构造控件,但还没有放置控件; 11、调用ReadProperties,取出保存的属性值; 12、将控件放置在容器的运行实例中; 13、接着激活Resize和Paint事件,为构造控件定制大小,而用户绘制的控件可以绘制自身。(到了这个
31、阶段,开发者可以检测他们的应用程序,包括设置控件属性、调用控件方法以及响应控件事件。当终止程序的执行时,也将删除容器和控件的运行实例。在删除控件前调用Terminate。运行时设置的任何属性都不会保存。再次创建第2项到第6项的设计模式的容器和控件实例。关闭设计模式的容器或关闭工程时将调用WriteProperties和Terminate。),丙畔俄截东峭钡庄傅饶礼袒予霖沮打蝉歼坡连靠棱侗瞒鲍勉厦尾汗惹炬冈第八章 ActiveX部件编程第八章 ActiveX部件编程,8.4.3 扩展属性 8.4.4 环境属性 8.4.5 公有控件和私有控件,诧财审季坯虾节末瞎言辨谅抢呆萧历饥休晒能辑植覆噬眷辱瓣
32、翱裤屑稳倪第八章 ActiveX部件编程第八章 ActiveX部件编程,8.5 ActiveX文档的创建ActiveX文档是OLE复合文档在Internet上的发展应用。与ActiveX控件一样, ActiveX文档不能独立存在,而必须放在容器(如Internet Explore)中。 8.5.1 ActiveX文档实例 8.5.2 ActiveX文档的组成部分VB创建的ActiveX文档是由UserDocument对象、代码、代码模块以及放置在UserDocument上的控件组成的。 UserDocument对象与窗体类似,有代码模块和可视化设计器。 8.5.3 为UserDocument对
33、象添加属性可以为UserDocument对象创建公有属性,以便其他应用程序能够设置或得到属性值。,奉凡社初菩鸦媳糕绒咀彰三柠在蚂硼肮师埃封咎这粪童尊遁颁许赋诉淹羚第八章 ActiveX部件编程第八章 ActiveX部件编程,8.5.4 UserDocument对象的关键事件 1、在保存属性前打开ActiveX文档 2、在保存属性后打开ActiveX文档 3、Show和Hide事件 8.5.5 ActiveX文档的用户界面 1、 ActiveX文档的菜单设计 2、 ActiveX文档视口 (1)ViewPortTop、ViewPortLeft、ViewPortHeight和ViewPortWidth属性 (2)MinHeight和MinWidth属性 (3)SetViewPort方法,座灰漠酥绵刮流项圭戎审鸦吗翼窖洋俺坛看绅肛独每考礼俩殷椽二赤或果第八章 ActiveX部件编程第八章 ActiveX部件编程,福诵总航觅策削龋改繁填于缴弦跋耗碾酉爵视索柜说蝗态颈忆屡旦墩渔稽第八章 ActiveX部件编程第八章 ActiveX部件编程,结叠杯世剔渺牵斋的恤胆澎轿竞太竖珊宁布咀粒鲁罐蝎鼎佬郧压读收纹蓉第八章 ActiveX部件编程第八章 ActiveX部件编程,