OLE自动化技术在Delphi与MapInfo集成地图开发中

最新更新时间:2011-04-21来源: 互联网关键字:地理信息系统  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 的自动回调消息。

关键字:地理信息系统  OLE  MapInfo  Delphi  回调 编辑:神话 引用地址:OLE自动化技术在Delphi与MapInfo集成地图开发中

上一篇:图像采集与处理在智能车系统中的应用
下一篇:MPEG-4在视频监控应用中的软件实现

推荐阅读最新更新时间:2023-10-12 20:24

看到没人的车在行驶可别报警,那是无人驾驶汽车在横跨美
美国汽车配件厂商Delphi Automotive上周日启动了无人驾驶汽车横穿美国的首次测试,起点为旧金山金门大桥。未来一周中,这一经过改装的奥迪SQ5 SUV将行驶3500英里(约合4023公里),奔赴纽约。    这辆无人驾驶汽车计划于4月3日纽约国际汽车展之前抵达纽约。Delphi表示:“这是美国里程最长的无人驾驶汽车尝试。”    这辆无人驾驶汽车可能会引起沿途司机的担忧。不过Delphi表示,如果遇到这辆无人驾驶汽车,司机们也不必担心。两名司机将会坐在车中,在紧急情况下对汽车进行手动操作。    Delphi位于密歇根州,目前是美国最大的汽车电子和安全系统供应商之一。在此次无人驾驶汽车的行驶过程中,
[嵌入式]
基于Delphi的DDS可视化新型任意信号发生器
1 引言 随着微电子技术的迅速发展,DDS技术得到了广泛的应用,市场上有很多高性能多功能的DDS专用器件,但其工作方式和控制方式固定,一般用户很难按自己的要求获得相应的波形 。同时任意波的输入方式目前都只限于时域,无法实现电子、通信等领域的科研与教学中所需频域参数定义的波形。本文介绍一种基于DDS的可视化信号发生器,它高精度地生成双通道±8 V、0.01 Hz~10 MHz正弦波等常规波形。还可产生数码流、调制信号、随机噪声、扫频信号及时域或频域自定义波等信号,信号参数均步进在线可调,由USB1.1与Delphi7.0完成与PC连机时的接口及图形操作界面设计,TFT实现单机工作时的图形操作界面,实
[模拟电子]
“芯”装备产业支持力度不减,半导体设备迎机遇
集微网消息,近期,中美贸易摩擦在一定程度上暴露了中国在半导体核心设备上存在短板,未来国家对本土半导体及半导体设备企业的战略扶持有望进一步加强。   2014年6月国务院印发的《国家集成电路产业发展推进纲要》,指明了发展目标:到2020年集成电路产业与国际先进水平差距逐步缩小,全行业销售收入年均增速超过20%,16/14nm制造工艺规模量产,封测技术达国际领先,关键装备和材料进入国际采购体系,基本建成技术先进安全可靠的集成电路产业体系;到2030年产业链主要环节达到国际先进水平,一批企业进入国际第一梯队。同时《纲要》明确了突破集成电路关键装备和材料等发展重点以及设立国家产业投资基金、落实税收支持政策等保障措施。 财政部先后于
[手机便携]
STM32Cube HAL库中断处理机制,以及函数实现原理
1写在前面 很多人都知道STM32CubeMX这套工具的一个目的:减少开发者对STM32底层驱动的开发时间,把重心放在应用代码上。 但是,STM32CubeMX只是生成了底层驱动的初始化代码。所以,我们还需要掌握:应用层代码如何调用HAL库函数接口,以及HAL库中断处理机制等相关知识。 HAL库牵涉的内容较多,本文拿HAL库中断处理来讲解,以及相关的回调函数。 HAL库中断处理机制 之前使用标准外设库开发时,中断程序(函数)由我们自己实现。 而HAL库的中断处理函数是按照HAL处理机制来实现,如USART1,统一由HAL_UART_IRQHandler来进行处理,如下图: 其它大部分外设(TIM、SPI、CAN
[单片机]
基于DELPHI的镍氢电池管理系统软件设计
摘要:通过对镍氢电池性能的研究,给出了一个应用ISA总线技术构建的、基于DELPHI编程平台的镍氢电池管理系统的设计方案,重点介绍了该系统的软件技术和实现方法。 关键词:DELPHI;充放电;软件;模块;SOC 1 前言 镍氢电池是目前大容量电池的主要品种,已在通讯、交通、电力等部门得到广泛的应用,同时它也是其它智能仪表中最为常用的备用电池。但在实际使用中,由于充放电控制不合理而损坏的电池占大多数。实际上,若镍氢电池充放电适当,通常可以工作10年时间。为此,笔者研制了镍氢电池自动充放电控制系统。该系统由恒流源充电器和恒流源放电器对电池进行充放电因此电流、电压、温度控制是该电池控制系统的重要部分。为此,该系统在总体考虑电流、电压、温
[电源管理]
汽车市场的电气化时代来临
对汽车产业而言,2017年5月是个值得关注的历史转折点。 全球最大汽车零部件制造商博世集团(Bosch Group)与美国最大的汽车零部件供货商Delphi先后宣布重大组织变动:博世将把自家的汽车起动机、发电机等事业部门出售给中国郑州煤矿机械集团;Delphi则将全面分拆旗下的动力总成(Powertrain)部门。 原公司将专注于电子电气业务,尤其是自动驾驶、智能技术及安全技术等领域。 内燃机汽车生命周期走入尾声 从产业发展的角度来看,博世与Delphi的动作,象征着问世已有逾百年历史的引擎车即将步入黄昏,与引擎搭配使用的供油、进排气、变速箱、传动系统、发电机等关键零部件,即便在短时间内仍有庞大的维修更换需求支撑其市场,但随着电
[嵌入式]
Delphi:高效的哈希函数
view plaincopy to clipboardprint? 01.function BKDRHash(buf: Pointer; count: Integer) : Cardinal; assembler; 02.asm 03. PUSH EBX; 04. XOR EBX, EBX 05. MOV ECX, EAX 06. XOR EAX, EAX 07.@LOOP: 08. TEST EDX, EDX 09. JZ @EXIT 10. MOV BL, 11. IMUL EAX, 131 12. ADD EAX, EBX 13.
[工业控制]
小广播
最新模拟电子文章
换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved