| 第一节 面向对象编程和OLE 在使用GeoMedia开发应用系统前,首先需要了解的是“对象”和“自动化”这两个术语。“对象”一词与“面向对象”程序设计密切相关。许多年前诞生的面向对象技术,在今天的软件开发环境中仍然受到相当的重视。面向对象是一种把数据及其操作封装在组件或对象里的软件组织方式。因此,在GeoMedia中,对象就是封装了一定功能的软件组件。 “自动化”是软件对象之间的通信处理,这些软件对象是创建应用系统的组成部分。在学习怎样使用自动化之前,首先需要浏览一下当今软件技术框架的发展历史。早期的OLE指对象连接与嵌入(Object Linking and Embedding)。在本文中,OLE还允许创建对象,并建立他们之间的关联。比如,您可以在Word文档中嵌入Excel表单,并能通过双击表单激活Excel。现在的OLE增加了以下技术: ※
组件(或对象)的集成 ※
通过二进制通信标准实现语言无关的开发 ※
对组件或对象界面的抽象 除此之外,OLE还包括三种技术:复合文档、自动化和OLE控件。复合文档是一种可以同时包含本地数据和多个在其它应用程序中创建的对象。另外,OLE还具有就地激活与拖-放功能。OLE自动化可以被看作一个程序向另一个程序提供可编程对象。例如,Excel提供了能在Visual Basic应用程序中操纵的表单和统计图对象;又如,GeoMedia提供了地图显示(MapViews)和管道(Pipes)对象,这些对象可以通过Visual Basic 或Visual C++程序来操纵。 OLE控件体现了许多OLE技术,包括COM、可连接的对象、复合文档、属性页、OLE自动化和对象持续性。控件是一种通常情况下可视的软件组件(比如:按钮、列表框、检查框),是为创建应用程序界面提供的砖头。自定义控件是用户为解决某些特定问题而自行开发的控件。 显然,这些主题需要更加深入的分析,才能有效的使用它们进行开发。不过,通过这些概念的介绍,您可以了解到 GeoMedia在那些方面适应了当今的软件体系结构。我们主要着眼于OLE系列技术中与自动化相关的部分。 第二节 何谓COM 尽管本文主要讨论如何自定义GeoMedia,但仍然有必要简要地概括一下组件对象模型(COM),因为它是GeoMedia体系结构的基础。即使您从不需要设计可编程对象,理解这一基础理论也是非常有益的。
OLE是建立在COM基础之上的。COM定义并且实现了允许软件组件(包括对象、应用程序和服务)之间实现交互的机制。也就是说,COM定义了软件组件之间的通讯协议。COM还描述了接口管理、状态报告、以及使用系统注册表解决的全球性的唯一识别码。与此同时,COM还定义了应用程序内部的对象之间,以及不同应用程序的对象之间的交互。
COM的实现就是接口的实现,COM对象是通过COM接口得以交互的。可以认为接口象生产者和消费者之间的合同,它定义了软件的目标和行为。接口由COM对象的一系列与语义学相关的功能或方法组成。如同不能违背合同一样,接口一旦被定义,就不能改变。作为应用程序开发者,你需要这个合同来防止应用程序所依赖的软件的任何改变。
组件式对象模型是OLE可扩展体系结构的关键所在,它提供了建立OLE其余部分的基础。COM是组件之间进行通信的二进制标准,COM并不依赖于Windows NT。微软和其它公司正在他们的操作系统上实现各自的COM库,这些操作系统除了Windows以外,还包括Unix和Macintosh。如果希望了解更多关于COM的资料,请访问微软开发者网络(MSDN.Microsoft.com)。Kraig Brockschmidt编写的《深入OLE 2》一书也提供了丰富的信息。
第三节 OLE的优点
OLE给用户和开发者提供了许多好处。OLE强调以“文档为中心”(Doument-centric)而不是以“应用为中心”
(Application-centric)的编程方案。也就是说,数据和数据格式与应用程序无关。用户无需进行繁琐的转换就可以操纵文档。数据同样可以跨文档共享使用。通过提供访问方法而非数据复制,可以更好地维护信息,并能有效简化信息发布的手续。
使用OLE对象及其接口,给开发者提供了强大工具来建立灵活、易于维护和升级的应用系统。一个OLE应用程序可以利用在其它OLE应用程序中实现的功能来扩展自身的可用性。作为系统集成者,我们再也不需要自己开发所有需要的功能,可以利用其它的OLE应用程序满足用户的需求。GeoMedia是通过嵌入技术实现这种体系结构的。
尽管OLE和COM需要的某些体系结构还没有讨论到,但是我们知道有那么一种通信协议存在于对象、自动化客户与控制器之间。这种协议就是接口。所有的对象都支持这种重要的IUnknown接口。通过这些接口,您可以在运行时刻学习其它应用程序的与对象服务相关的能力。可以在既不影响当前应用程序也不影响与之交互的其它应用程序的情况下增加对对象和接口的支持。记住,这就是COM的“合同”——接口一旦定被义了,就不能改变。GeoMedia通过编程持久性来实现这一点。
第四节 何为自动化
OLE自动化是应用程序赖以提供OLE对象的二进制标准。OLE自动化包括两个要素:控制器和对象。自动化控制器是实现程序同自动化对象通信的脚本语言工具。自动化控制器包括:VC++、Visual Basic、PowerBuilder、Developer 200、Delphi等。自动化对象是支持必要OLE接口的可编程组件。另外,整个程序可能是一个自动化对象。例如:表单应用程序可能提供表格、统计图、单元格或者一组单元格,这些都是不同类型的对象。字处理软件可能提供了应用、文档、段落、句子、书签或者选择集等对象。
自动化控制器:用于创建管理自动化对象的程序的脚本语言工具,等同于自动化客户。
当应用程序支持OLE自动化时,它提供的对象可以被任何自动化控制器使用(包括VB、VC等)。当使用脚本语言工具操纵自动化对象时,是通过激活对象的方法,或者调用“设置”(Setting)/“获取”(Getting)属性来实现的。
自动化对象:被自动化控制器操纵的可编程软件组件,等同于自动化服务器。
自动化客户等于控制器,客户是脚本工具或者内置该工具的应用程序,客户操纵自动化对象。自动化服务器等同于自动化对象,自动化服务器是一种可以被自动化客户操纵的软件组件,它提供了可编程的自动化对象。提供可编程对象使得客户可以通过直接访问对象和服务器的功能来“自动化”地激活特定的处理进程。
对自动化对象的支持允许你使用已有的应用程序来使您的工作流程达到最佳效果。您同样可以利用其它强大的应用程序创建非常符合特定需要的应用,大大减少了开发时间和开发难度,并能非常满足您或者单位的需求。通过自动化接口的标准化,该应用可以使用某种通用程序设计语言创建,而不需要与不同产品相关连的多种脚本的编程语言。
为使自动化客户有效地访问自动化对象,客户(控制器)必须有服务器对象的信息,必须了解每一个对象内部的属性和方法。为了实现信息交换,服务器必须创建一个类型库(Type Library)来定义每个对象。类型库同时还描述对象的属性,包括每一个属性的数据类型。最后,类型库还描述了对象的方法,包括方法的返回值和方法的参数列表(变量名和参数数据类型)。在GeoMedia中,每一个DLL、OCX和EXE都有一个类型库,类型库文件的扩展名为.tlb。就Visual Basic自动化服务器而言,动态连接库(DLL)本身包含类型信息。GeoMedia对象和相应的类型库见附录。
第五节 操纵对象
为了更有效地使用自动化服务器编程,首先要了解如何操纵自动化对象。对自动化对象的所有操纵和控制都通过对象的接口进行。对象的接口分为三种,即属性(Property)、方法(Method)和事件(Event)。
属性控制对象的外观和性质,如果把对象当作结构的话,那么属性就是成员变量。比如颜色和重量等。
方法是与对象有关的操作,在面向对象编程环境里,方法就是对象的行为和动作。
事件是对象要响应的信号或者动作。比如点击窗口上的按钮会激活按钮对象的click事件。
几乎所有的对象都有属性和方法,但并非所有的对象都有事件。一般而言,控件都有事件。
成员对象(member object)是另一个对象的属性。例如:GeoMedia的Application对象提供的Document属性本身也是一个对象。该Document就是Application对象的成员对象。
附属对象(Dependent Object)类似于成员对象,但它与容器对象的关系更为紧密。附属对象不能在容器对象之外独立创建。例如:在GeoMedia 的GDO对象中,GField对象就是GTableDef对象的附属对象。创建GField对象必须使用GTableDef的方法,不能独立创建。
最后需要介绍的是一种特殊的对象—集合(Collection)。集合是管理一组相似对象的自动化对象。一般而言,集合对象与其管理的对象有着相同的名字,只不过集合的名字使用复数形式。例如Windows是Window对象的集合,Queries是Query的集合。集合中的对象可以是同构的也可以是异构的。GeoMedia中的Windows集合中的对象是异构的,因为它同时包含DataViewWindow和MapViewWindow两种类型的对象。Queries集合则是同构的,它只有Query对象。由于经常需要处理集合中的所有对象,因此,理解要操纵的集合的类型非常重要。
尽管集合对象可以拥有自己独立的方法和属性,但是它必须有Count属性和Item方法。Count属性表示集合中的对象数目;而Item方法则用于返回指定序号的对象引用。比如:
For I = 1 To objCollention.Count
ObjX = objCollention.Item(I)
Next I
新的集合标准是以1作为下标的开始(称为1基准),而不是0。但是也有一些集合的下标从0开始(称为0基准)。在GeoMedia里,所有的GDO集合都是0基准的,而GeoMedia集合则是1基准。
另外,集合经常具有以下方法:
·
添加值或追加对象。
·
移去索引或删除对象。
·
_NewEnum-支持For Each结构的隐藏方法。
对象通常具有默认的方法或属性。这种默认机制允许您省略属性和方法名,而且可以暗中获取属性值或激活方法。比如,Item通常是集合对象的缺省方法。下列情形中:
objCollection.Item(I)
objCollection(I)
是相等的声明。在文本控件里,Text 属性是缺省特性,那么,
txtControl1.Text
txtControl1
在文本控件中获取文本属性值具有等同的效果。
Table - 1
对象的特性
项目
| 说明
| 属性
| 数据成员和特性
| 方法
| 操作对象的过程或函数
| 事件
| 对象能识别/响应的行为
| 成员和附属对象
| 对象或集合的组成元素
| 集合
| 包含一系列相似对象的对象
|
操纵对象的另一个重要的概念是点操作符。点操作符用于访问对象的属性或者调用对象的方法。当对象包含成员对象,您可以使用点操作符访问对象层次中的所有对象。假定Application对象包含一个叫Document的成员对象,而Document对象包含一个叫Name的属性,那么可以使用以下的表达式访问Name属性:
Application.Document.Name
尽管对于访问层次的深度没有限制,但是,对一定深度的重复访问不仅有碍代码的可读性,而且存在潜在的执行效率问题,因为点操作符需要对自动化服务器发出请求。您应当检查所有使用点操作符的代码行。例如,如果在一个循环中重复地访问一个对象的多个属性,使用With块或者引入临时变量会提高效率。例如:
Application.Document.Name = ‘Automation Overview’
Application.Document.Date = ‘7/12/97’
Application.Document.Author = ‘John Doe’
改写成如下两种格式将会更加高效:
Set tmpDoc = Application.Document
tmpDoc.Name = ‘Automation Overview’
tmpDoc.Date = ‘7/12/97’
tmpDoc.Author = ‘John Doe’
或:
With Application.Document
.Name = ‘Automation Overview’
.Date = ‘7/12/97’
.Author = ‘John Doe’
End With
|