微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > OLE自动化技术在Delphi与MapInfo集成地图开发中

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

时间:06-25 来源:青岛科技大学自动化与电子工程学 点击:

图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 的自动回调消息。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top