OLE自动化技术在Delphi与MapInfo集成地图开发中
扫描二维码
随时随地手机看文章
摘要:本文论述了利用OLE 自动化技术和可视化编程工具Delphi 来实现MapInfo 地图的集
成,并通过例程的方式介绍了集成地图的方法以及对MapInfo 的消息回调。从而实现了
MapInfo 集成到Delphi 应用系统中,达到高效开发应用型GIS(地理信息系统)软件的目的。
关键词: 地理信息系统;OLE;MapInfo;Delphi;回调
The Application Of OLE Automation Technology In Map-integration Between Delphi And MapInfo TONG Gang, SHEN Qing-hua,BI Wei-zhun (College of Automation and Electronic, Qingdao University of Science and Technology, Qingdao 266042, China)
Abstract :The method of realizing map-integration between Delphi and MapInfo using OLE automation technology is discussed, and the method of Map Integration and the Callbacks of MapInfo message is also introduced with example in this article. So MapInfo is integrated in application of Delphi to develop efficiently applied GIS(Geographical Information System).
Key words:GIS ;OLE ;MapInfo ;Delphi ;Callbacks
1 引言
在Windows系统中,MapInfo二次开发方法主要有两种,即利用自身所带的开发工具
MapBasic和利用诸如 Delphi、VC等优秀开发工具。利用MapBasic 这样自带的开发工具开
发出来的程序必须在MapInfo环境中运行,系统资源开销大,开发效率不高,功能也不强,
难以开发界面友好而功能强大的定制程序,他较适合扩展MapInfo的功能。利用Delphi之类
的优秀开发工具进行二次开发,后台对地图的处理依然采用MapInfo支撑软件,但由于前台
采用了Delphi这样的专业开发工具,在开发效率、开发能力、汉化、移植性等方面都优于自
带的工具,同时能随整个软件开发行业的发展不断发展[1]。此种方法的关键是前台定制程序
与后台MapInfo之间的结合方式。目前主要有利用OLE Automation 和利用MapX标准组件进
行开发。
Delphi是美国INPRISE公司的面向对象的可视化软件开发工具,具有非常强大的功能,
可以快速、高效地开发出基于Windows环境下的各类程序,尤其是在界面设计、数据库编程
等方面具有独到之处。面向对象和可视化设计是其最突出的优点,同时,它具有强大的编译
能力,从而大大提高了程序的执行效率,成为众多程序员的开发工具。
2 OLE 自动化技术
OLE(Object Linking and Embedding)是美国Atduscorporation提出的一组协议和函数,
目的是为了简化复合文件的建立和维护,它是微软Windows系统中最为复杂的子系统,是进
程间通信的一种形式。所谓对象链接是指一个复合文件内含一个参考指针引用到其它应用程
序的对象,透过OLE把Windows各个应用程序连接起来。
利用这种能使用户共享不同应用程序信息资源的OLE技术,可以很容易地集成各类应用
程序。OLE自动化是一种为WINDOWS设计的交互进程通信机制,它允许在不同的应用程序
之间相互访问,可以让一个应用程序访问另一个应用程序或DLL(动态链接库),如在Delphi中创建EXCEL中的表格等,而且可以访问这些应用程序对象的方法(Method)与属性
(Property),它克服了链接和嵌套中存在的缺点,即无法用编程手段对对象进行控制,实现
了对OLE组件的编程式控制。OLE 自动化包括两部分应用程序:一个是把OLE 组件显现出
来使之可控制的应用程序,叫做OLE 自动化服务器;另一个是利用OLE服务器提供的组件,
对该对象进行控制操作的应用程序,叫做OLE客户。由于OLE 自动化服务器很小,程序的
稳定性以及开发和维护都要优于传统的大程序。对于每个OLE对象的属性和方法,程序员可
以决定将OLE自动化服务器的某些属性和方法通过OLE 自动化表现出来,而私有对象对于
外部用户来说是不可见的,但是OLE客户编程人员只需知道包含对象的应用程序的名称、对
象的类的名称和想要使用的属性和方法的名称,就可以使用自动化服务器了[3]。通过OLE自
动化技术,运用Delphi语言可以很方便地进行地图集成,此时,Delphi程序即为客户程序。
3 利用OLE 自动化技术实现地图集成
进行 Delphi 与MapInfo 的集成开发时,可以将Delphi 作为OLE 自动化的控制方或DDE
的客户,把MapInfo 置于后台运行,但最好采用OLE 自动化方式,因为这种方式比DDE
方式更快、更可靠,并且在调试运行中可以获得更多出错信息。OLE 自动化是Windows 程
序之间相互操作的技术,可以创建自动化客户程序来操纵其他程序,而MapInfo 则可以作为
OLE 对象的服务器,并提供了一套相应的方法。
3.1 实现Delphi 取得对MapInfo Professional 的控制和服务
Delphi 程序中通过特定的ActiveX 控制接口,执行相应接口方法函数,MapInfo
Professional 发出控制命令,取得其服务,达到操纵嵌入在Delphi 程序界面上的MapInfo 图
形资料的目的。对于此技术点可以利用Delphi 对ActiveX(OLE)支持的函数启动和控制
MapInfo Professional 运行。OLE 自动化是Windows 程序之间相互操作的技巧, Delphi 完全
支持OLE 自动化操作,可以创建自动化客户程序来操作其他的程序,而MapInfo 则可以作
为OLE 对象的服务器,并提供了相应的一套方法,Delphi 通过建立一个OLE 对象来创建客
户自动化程序,要创建OLE 对象,需调用CreateOLE—Object 函数(在comObj 单元中定义),
并且把返回结果赋给一个Variant 类型的变量,以后程序就通过这个变量来访问 OLE 对象。
这时的Delphi 程序是ActiveX (OLE)客户应用程序,控制MapInfo Professional 运行, 在后
台运行的MapInfo Professional 是ActiveX (OLE)自动化服务器,为Delphi 程序提供服务。
Delphi 与MapInfo Professional 的结合方式如图1。
图1 Delphi 与MapInfo Professional 的结合方式
Fig.1 Combination of MapInfo Professional and Delphi
3.2 Delphi 应用程序与MapInfo 的集成
(1)建立MapInfo 自动化对象
Delphi 创建客户自动化程序是通过建立一个OLE 对象来实现的,要创建OLE 对象,需
调用CreateOLEObject 函数(在OLEAUTO 单元中定义),并把返回结果赋给一个Variant 类
型的变量,以后程序就通过这个变量来访问OLE 对象。设变量名为Olemapinfo,其具体语句
如下:
var OleMapInfo:Variant;//在Delphi 应用程序中声明OLE Variant 类型的变量
Olemapinfo:=CreateOleobject(‘mapinfo.application’);//创建OLE 对象
(2) Delphi 应用程序中集成MapInfo 窗口
Ole 自动化对象建立后,后台MapInfo 成功启动,可以使用该对象的Do 方法向MapInfo
发送命令,如:
Olemapinfo.do(’set application window ’+winhand);
Olemapinfo.do(’set next document parent’+winhand+’style l’);//重定位MapInfo 文件窗口其中,还可用来重定位其他特殊窗口或图例,可采用 MapBasic 的”setwindow”语句;
“style1”也可以为“style2”或“style3”,它表明所创建窗口的类型。
完成上述设置,就可以在客户程序中打开 MapInfo 文件了,如:
Olemapinfo.do (‘open table”city.tab”’);
Olemapinfo.do (‘map from city ’);//打开MapInfo 表直接调用MapInfo 菜单或按钮命令对地图窗口进行操作,只需调用MapInfo 的
RunMenuCommand 方法,从而保留有标准的MapInfo 按钮的功能,大大减少了重新编程的
难度而轻松实现MapInfo 的基本功能。具体语句如下:
Olemapinfo.runmenucommand(1705);//放大
Olemapinfo.runmenucommand(1706);//缩小
Olemapinfo.runmenucommand(1702);//漫游
(3) 终止MapInfo 程序
在调用 Delphi 的CreateOleObject0 函数来创建一个新的MapInfo 事件时,在释放该对象
变量时,该MapInfo 事件就终止了,当该对象变量为局域变量时, 当退出局域过程时,该
MapInfo 事件就被释放了,若为全局变量时,必将其赋值为”Unassigned”才能得以释放。语
句如下:Olemapinfo:=Unassigned;//释放全局变量,终止MapInfo程序Application.Terminate;//终止Delphi 程序
3.3 Delphi 中MapInfo CallBack 的实现
通过对集成地图程序的设置,可以使MapInfo 能自动地向客户程序发送信息,这种类型的标志信息,即事件导致MapInfo 调用客户程序,这种消息称之为回调。
要使用回调,客户端程序必须能充当OLE 自动化服务器,而利用Delphi 能很轻易实现。
其实现原理如图2:
图 2 Delphi 中实现MapInfo 的callback 的原理图
Fig.2 The schematic diagram of realizing callback of MapInfo in Delphi
要实现 Maplnfo 的CallBack,一般有以下几个步骤:
1)创建一个类,定义若干OLE 方法(Method)。如果要得到MapInfo 的状态栏上的内容,
则创建SetStatusText 方法(带一个字符串参数);如果要取得发生变化的地图窗口的ID 号,
则创建Windowcontentschanged 方法(带一个整形参数);
2)为在1)中定义的类创建一个对象;
3)在确认MapInfo 已经启动后,调用MapInfo 的SetCallBack 方法,将OLE 自动化对象
注册MapInfo 所发送消息的“接收器”中;
4)自定义菜单或按钮,通过这些菜单或按钮来调用在1)中定义的方法。
当 MapInfo 中发生一个事件时,MapInfo 就会将相应的信息组织成一定的形式,以方法
的参数方式传递到客户应用程序。在这些方法的内部,程序员可以对这些信息进行处理,提
取所需的信息。以自定义客户程序的状态栏为例,回调的使用方法如下:
1)建一个类,定义SetStatusText 方法。此方法带一个WideString 类型的参数StatusText。
这个参数是MapInfo 向客户程序传递过来的。
在 Delphi6.0 中选择File|New|ActiveX|Automation Object,通过启动Automation
Object 向导打开“Type Library”编辑器来实现。这里假设创建的类名为TmyCallBack。
2)应用程序窗体中添加状态栏。
3)使用第一步中定义的类创建一个对象。
varCallBack := TMyCallBack.Create;
4)调用自动OLE 对象的SetCallBack 方法传递参数。
oleMapInfo.SetCallback(varCallBack As IMyCallBack);
5)在SetStatusText 方法中处理由MapInfo 传递的StatusText 参数,控制状态栏的显示。
procedure TMyCallBack.SetStatusText(const StatusText: WideString);
begin MainForm.StatusBar1.Panels[0].Text := StatusText;
//MainForm 是容纳地图组件的窗体,StatusBar1 是添加状态栏的缺省名,panel,用于显
示MapInfo 的状态栏上的内容;End;
4 结束语
利用 OLE 自动化技术, 通过 Delphi 实现了MapInfo 的二次开发,充分发挥了Delphi
编程工具强大的数据库编程能力和MapInfo Professional 的图形处理能力。而在开发过程中,
两者是相互独立的,Delphi 可以很方便地并不需做任何改动地调用MapBasic 代码,实现通
过简单的OLE 自动化技术提交控制命令来完成MapInfo Professional 的功能和效果,取得很
好的应用效果。同时,在进行MapInfo 消息回调处理方法上,也可利用OLE 自动化技术来
MapInfo Professional 的自动回调消息。