Microsoft Word 对象模型

理解Word的对象模型是对其编程的基础,Word以层次结构组织对象。

Word提供了数百个可与之交互的对象。这些对象排列在一个与用户界面密切相关的层次结构中。层次结构如图所示,顶部的对象是Application对象。此对象表示Word的当前实例。Application对象包含Document、Selection、Bookmark和Range对象。这些对象各自都有很多方法和属性,可以访问这些方法和属性来操作对象或与对象交互。图中存在许多重叠,是因为可以通过多种方式来访问相同类型的对象。

Application对象表示Word应用程序,是其他所有对象的父级。它的所有成员通常作为一个整体应用于 Word。可以使用该对象的属性和方法来控制Word环境。在应用程序级外接程序项目中,您可以使用ThisAddIn类的Application字段访问Application对象。在文档级项目中,可以使用ThisDocument类的Application属性访问Application对象。

Document对象是Word编程的中枢。它表示文档及其所有内容。当打开文档或创建新文档时,就创建了新的Document对象,该对象被添加到Application对象的Documents集合中。具有焦点的文档称为活动文档。它由Application对象的ActiveDocument属性表示。

Selection对象表示当前选择的区域。在Word用户界面中执行某项操作(例如,对文本进行加粗)时,应首先选择或突出显示文本,然后应用格式设置。Selection对象始终存在于文档中。如果未选中任何对象,它表示插入点。此外,所选内容可以包含多个不连续的文本块。

Range对象表示文档中的一个连续的区域,由一个起始字符位置和一个结束字符位置定义。Range对象的数量并不局限于一个。可以在同一文档中定义多个Range对象。

更多信息参见 Office VBA Reference

Microsoft Excel 对象模型

理解Excel的对象模型是对其编程的基础,Excel以层次结构组织对象。

一个Excel应用程序就是一个Application,全局的对象比如菜单,工具条都属于Application对象。
一个Application可以包含很多个Workbook(Workbooks),具体而言就是,可以同时打开很多个工作薄(Workbooks),但是某一时刻只有一个工作薄(Workbook)处于可编辑状态,这个工作薄就叫活动工作薄(ActiveWorkbook)。
一个Workbook可以包含很多个Worksheet(Worksheets),具体而言就是,一个工作薄(Workbooks)可以包含很多工作表(Worksheets),但是某一时刻只有一个工作表(Worksheet)处于可编辑状态,这个工作表就叫活动工作表(ActiveWorksheet)。
一个Workbook可以包含很多个Shapes对象,工作表中还可以包含一些图表、标记、注释、控件等,这些都是浮在Sheet页上的,统称为Shapes,其中使用最多的是图表(Charts)。
一个Worksheet可以包含很多个Range对象,具体而言,一个工作表里面有很多个单元格,单元格范围用Range表示,Range可以是一个单元格也可以是多个单元格,单元格都是嵌入到Sheets中的。

更多信息参见 Office VBA Reference

AutoCAD 对象模型

理解AutoCad的对象模型是对其编程的基础,AutoCad以层次结构组织对象。

在顶层是Application对象(即AutoCad 本身),其他对象均为Application对象的子对象。在Application对象下面是Preferences(优先设置)和Document(文档)对象,通过Preferences对象可以对AutoCad Tools>Preferences菜单项中的几乎每一个选项进行访问和修改,以获取或改变AutoCad的优先设置。

Document对象是控制AutoCad图形文件的直接对象,它代表某一个装入的CAD图形文件(一般设为当前激活的文件)。Document对象下面有Model Space(模型空间)和Paper Space(图纸空间)对象及Blocks(块)、Layers (层)、Plot(出图)、Selectionsets(选择集)、 views(视图)、 utility(功能)等一系列对象(集合),其含义与AutoCad中相似。

Model Space是当前图形文件中图形实体,如直线、圆、多义线等的集合,每个实体即是一个对象,可通过属性和方法改变实体或生成新实体。

对非图形实体,如层(layer)、线形(line type)等的访问则通过访问Document对象下面的相应的集合类型的子对象,如Layers 、LineTypes等来实现。

集合类型的对象可以使用VB中所有的集合操作方法。

Plot对象提供了访问Plot对话框中各选项的桥梁,使应用程序具有用不同方式控制AutoCad出图的能力。

Utility对象使用户在AutoCad命令行与CAD交互成为可能,通过它可以处理整型、浮点型、字符型等用户输入,还可以接受点(Point)或角(Angle)等AutoCad的特殊量。

更多信息参见 Autodesk product documentation

后期绑定与前期绑定

后期绑定

  将对象分配给一个声明为objcet类型的变量,若将一个变量声明为variant or object , 包括as form,as control变量,vb编译时就无法确定该变量讲引用那种类型的对象,应用程序只能在运行时确定对象的属性和方法。

  使用后期绑定,每次调用属性或者方法时,vb都将成员名传给该对象IDispatch接口的方法-GetIDsOfNames方法,GetIDsOfNames返回 该成员的id或者DispId,vb程序再将DispID传给IDispathch接口的Invoke方法来调用该成员。

  对于进程外部件而言,这就意味着一次额外跨进程调用,调用开销增大。

(idispatch接口:IDispatch接口把所有成员函数的入口地址放入到一个数组中,并且内部组织了一个Map,将数组索引和方法名称一一影射,DispId(COM 事件或者函数的调度 ID)就是这些方法在数组中的索引。通过DispId可以找到该方法的地址,调用该方法。

如,Dim oAutoCAD As Object
Set oAutoCAD = GetObject(, “Autocad.Application”)

前期绑定

  VB在编译时就知道属性或者方法的所在对象。

  前期帮定预先知道函数成员在类型中的DispID,不需要调用GetIDsOfNames方法。而且早期绑定允许程序在编译时分配内存,或者进行其他优化,从而生成更高效的应用程序。

如,Dim oAutoCAD As AcadApplication
Set oAutoCAD = GetObject(, “Autocad.Application”)

 使用比较

  可见,前期绑定的效率高于后期绑定的效率,在进程内创建对象,据说速度比例是2:3。而且前期绑定,在集成开发环境下,方法成员会自动显示。前期绑定会减少运行时的错误,但前期绑定时,在vb下需要引用dll文件或tlb文件,如果被引用的组件不存在,整个引用程序也不能运行,如果是后期绑定,只要在创建对象createobect时才会出错。前期帮定时,如果被引用组件版本不同,可能会有兼容性问题,但是如果是后期绑定,则没有问题。

面向对象编程(OOP)

对象(Object)

对象代表应用程序中的元素,类似于汽车中的轮子、发动机等,抑或汽车本身。AutoCAD中有许多对象,例如:文档、模型空间、直线、图层、字典等。Excel中也有许多对象,例如:工作簿、工作表、单元格、图表、窗体,或是一份报告。程序中调用对象的任一方法或改变它的属性之前,必须先声明对象如,Dim oDraw As Object或Dim Workbooks As Object。

对象集合(Collection)

对象集合是一个包含几个相同性质的对象的集合。例如,在AutoCAD中的Documents 对象包含了所有已打开的Document(文档)对象,这当然指多文档环境(MDI)。在Excel中的Workbooks 对象包含了所有已打开的Workbook(工作簿)对象,Worksheets对象集合包含了某个工作簿中的所有工作表Worksheet。

集合中的项目可以通过索引号或名称来做识别。例如,Documents(1) 指的是索引号是1的文档对象。Workbooks(1) 指的是索引号是1的工作簿对象。需要注意的是AutoDesk是从0开始,而MicroSoft则是从1开始。

父对象与子对象(Parent Object And Subobject)

汽车可以包含轮子和发动机,这就是典型的父对象与子对象。

在AutoCAD中,文档对象可以包含直线对象、圆弧对象等。在Excel中,Worksheet对象可以包含单元格对象和图表对象等。

方法(Method)

方法指的是对象能执行的动作。例如,Add是下拉列表控件ComboBox对象的一个方法,因为它会增加一个新项目到下拉式列表框中。

下面的程序调用 Add 方法,增加一个新的项目到下拉列表控件“Combo1”项目中。

Sub AddEntry(newEntry as String) ‘ newEntry作为过程的参数被传入过程AddEntry

Combo1.Add newEntry ‘ newEntry作为一个项目增加到下拉列表框中

End Sub

某文档oDraw另存为AutoCAD 2000版,SaveAs就是文档的一个方法。oDraw.SaveAs sFullName, 12 ‘ac2000_dwg = 12, AutoCAD 2000 DWG (*.dwg)

如果对象共享共同的方法,则可以操作整个对象集合。例如,下列的过程会预览本工作簿所有的工作表。oWorkbook.Worksheets.PrintPreview

事件(Event)

事件是一个对象可以识别的动作,像单击鼠标或按某键等,在系统捕捉到对象的事件后,执行该事件对应的程序代码,从而实现相应控制。

不同的对象具有不同的事件。例如,文档拥有的事件:Activate、Deactivate、ObjectModified、Save等。工作簿拥有的事件:Open、Activate、BeforeClose、BeforePrint、BeforeSave、NewSheet、SheetChange等,工作表拥有的事件:SelectionChange、Change、Activate等。

在事件模块中写入需要的代码,当对象可识别的事件发生时,这些代码将被执行。

简要示例如下:

Private Sub oWorkbook_Open()

MsgBox “您打开了当前的工作簿!”

End Sub

属性(Property)

一个对象的属性定义了对象的特征,诸如大小、颜色或屏幕位置,或某一方面的行为,诸如对象是否激活或是否可见。可以通过修改对象的属性值来改变对象的特性。

若要设置属性值,则在对象的引用后面加上一个表达式,它是由属性名加上等号(=) 以及属性值所组成的。

例如,oDraw(0).Name = “test11″设置了0号文档名为test11。下面的语句设置“test”工作表的名称而改变工作表的标签名称。oWorkbook.Worksheets(“test”).Name = “test11”

有些属性并不能设置,只能读取。通过检索每属性的帮助主题,可以看到是否可以设置此属性(读与写),或只能读取此属性(只读),还是只能写入此属性(只写)。

可以通过属性的返回值,来检索对象的信息。

Debug.Print oDraw(0).FullName