PowerBuilder和MapInfo的集成开发技术
作者:佚名; 更新时间:2014-12-05
 摘要: 本文介绍了客户/服务器开发工具PowerBuilder和桌面地图信息系统MapInfo集成开发的基本方法。重点讨论了集成开发中的一些关键技术的实现方法。
 
关键词:PowerBuilder,MapInfo,MapBasic,系统集成,OLE自动化,回调
 
0 引言

PowerBuilder 是一个面向对象的用于构造基于客户/服务器(Client/Server)数据库应用系统的开发工具,它通过ODBC可同时支持Sysbase、Oracle、Informix、SQL Server等多种关系数据库,信捷职称论文写作发表网,具有强大的数据库应用程序开发功能,尤其是它提供的如数据窗口(Data Window)等工具,使其能够更加方便有效地访问与操纵数据库。

MapInfo是由美国MapInfo公司推出的地理信息系统开发平台,其核心包括MapInfo Professional和MapBasic两个部件。通过MapInfo平台,能把大量信息直观地与地理图形有机联系起来,使枯燥的表格数据可视化,从而极大地方便了数据分析和辅助决策。

利用PowerBuilder强大的数据访问与操纵能力和MapInfo的地图信息管理功能,结合Integrated Mapping技术、OLE自动化技术等,将MapInfo地图集成到PowerBuilder的应用中,可以迅速地开发出具有强大地图处理能力的应用程序,使数据库中繁杂抽象的数据快速、准确、灵活地显示于电子地图之上,将数据可视化,实现空间数据和属性数据的有机结合。

1 开发框架

使用PowerBuilder和MapInfo集成开发技术所开发的应用程序,称为集成的地图应用程序(Integrated Mapping Application)。在集成的地图应用程序中,以客户/服务器的开发模式,使用PowerBuilder开发的应用程序称为客户程序。客户程序运行在前台,通过OLE调用在后台运行的作为OLE自动化服务器的Mapinfo。

在集成的地图应用程序中,根据MapInfo提供的Integrated Mapping接口,在PowerBuilder客户程序中使用Outbound OLE Automation(输出OLE自动化)技术,将MapInfo的地图窗口集成到客户程序中,从而使客户程序具备地图处理能力。客户程序使用MapInfo OLE自动化对象、MapBasic OLE自动化对象的有关属性和方法,通过MapInfo OLE自动化服务器对集成的地图窗口进行控制。图1给出了客户程序和服务器程序间的关系。


图1 PowerBuilder客户程序和MapInfo服务器的关系

2.建立PowerBuilder客户程序和MapInfo OLE服务器的连接

建立PowerBuilder客户程序和MapInfo OLE服务器的连接在原理上是:在PowerBuilder开发的客户程序中,通过使用Outbound OLE Automation技术实现客户程序和MapInfo服务器的连接,借助OLE调用MapInfo服务器。具体实现上是:在包含地图窗口的框架窗口的Open事件中添加代码,创建一个新的OLEObject,而将MapInfo作为这个新的OLEObject的OLE服务器。要调用MapInfo服务,则需调用ConnectToNewObject()函数并传递OLE Programmable Object的程序标识,即“MapInfo.Application”:

//OLEObject对象的实例

OLEObject MapInfo

//接收错误代码

Integer ErrCode

//创建一个与MapInfo进行通信的OLE自动化对象

MapInfo = Create OLEObject

//连接OLE自动化对象到MapInfo服务器

ErrCode = MapInfo.ConnectToNewObject("MapInfo.Application")

If ErrCode <> 0 Then

MessageBox("Fatal Error", "Error connecting to the map server. Exiting...")

Ruturn

End If

在退出应用程序时,要调用DisConnectToObject()函数断开OLE自动化对象和MapInfo OLE自动化服务器之间的连接,并撤消OLE自动化对象,以释放其占用的系统资源。为此,可在上述框架窗口的Close事件中添加代码实现:



//断开与OLE自动化对象与MapInfo服务器的连接

MapInfo.DisConnectToObject()

//释放OLE自动化对象

Destroy MapInfo

3.将地图窗口集成到PowerBuilder应用程序中

要将MapInfo的地图窗口集成到PowerBuilder开发的客户程序中,必须在客户程序中为MapInfo中的应用窗口重新指定父窗口,并指定一个Picture控件作为集成的地图窗口的父窗口。可以使用OLE自动化对象的Do方法实现上述功能:

//重新指定MapInfo中的应用窗口的父窗口为应用程序窗口

//其中w_map为一个窗口

MapInfo.Application.Do ("Set Application Window " + String(Handle(w_map)))

//指定一个Picture控件棗p_map为地图窗口的父窗口,将地图窗口集成到客户程序中

MapInfo.Do ("Set Next Document Parent " + string(Handle(p_map)) + " Style 1").gif (11237 字节)" src="/Newspic/20051181642511909.gif" width=681>

图2 回调技术的实现

4.实现回调

在PowerBuilder的客户程序中,是通过OLE自动化对象对集成的地图窗口进行控制,如图2所示。当客户程序在地图窗口进行有关的操作后(例如使用某个自定义工具在地图窗口上单击某个地图对象时),对应的事件只传递给MapInfo服务器,而不直接传递给客户程序,为了在客户程序中对事件进行处理,必须采用回调技术。由于在PowerBuilder中不能定义公共的回调类,因此必须编写一个在MapInfo服务器中运行的MapBasic应用程序,用来将回调信息反馈给PowerBuilder客户程序。其实现过程为:

首先,在包含集成地图窗口的PowerBuilder应用窗口创建一个用户自定义事件ue_SelectionMade,事件ID为pbm_Custom01(= 1024)。

然后,编写一个在MapInfo服务器中运行的MapBasic应用程序,在此应用程序中添加对地图窗口事件进行处理的子程序。当对客户程序中的集成地图窗口进行操作时,MapBasic程序中对应的事件处理程序被触发。在事件处理程序中,可以将要传递给客户程序的信息保存到MapBasic中定义的一个全局变量中,然后使用Win32 API函数PostMessage(),以PowerBuilder应用窗口的句柄和该窗口的用户自定义事件的ID为参数,向PowerBuilder客户程序发送消息,这样PowerBuilder客户程序就可以在该窗口的用户自定义事件中处理地图窗口事件了,并且还可以使用MBApplications对象的方法,获取MapBasic全局变量中保存的事件信息。如下代码展示了MapBasic应用程序在接收到地图对象选择事件时的处理的过程:

' 预定义PowerBuilder应用窗口的用户自定义事件的唯一数值标识符

DEFINE SELECTION_MADE 1024

'响应地图对象选择事件

Sub SelChangedHandler()

'如果选中一个地图对象

If CommandInfo(CMD_INFO_SELTYPE) = 1 Then

'保存地图对象所在的表的名称

g_seltabname = SelectionInfo(SEL_INFO_TABLENAME)

'向PowerBuilder客户程序发送消息

iRc = PostMessage(g_pbhwnd_bg,SELECTION_MADE,0,0)

End If

End Sub

下面的程序段中给出了实现回调时PowerBuilder客户程序的处理过程。该处理过程使用了MapBasic编写的mbserver.mbx程序。在MapBasic程序中保存事件信息的变量为g_SelTabName,而g_PbHWnd是MapBasic程序中用来接收PowerBuilder客户程序窗口句柄的全局变量。

//在MapInfo服务器中运行MapBasic应用程序

MapInfo.Do("Run Application ~"" + gs_AppDir + "DataFusion.mbx~"")

//创建对MapBasic应用程序进行控制的OLE自动化对象

MBAppOleObject = Create OleObject

MBAppOleObject = MapInfo.MBApplications.Item(1)

//传递PowerBuilder客户程序中的窗口句柄给MapBasic应用程序

//以便MapBasic应用程序将返回给PowerBuilder客户程序

MBAppOleObject.MBGlobals.Item("g_pbhwnd_bg").Value = String(Handle(this))

由下面代码所示的PowerBuilder客户程序就可以在窗口w_map的用户自定义事件ue_SelectionMade中处理地图窗口事件:

//在PowerBuilder客户程序的用户自定义事件中使用MBAppOleObject对象获

核心期刊快速发表
Copyright@2000-2030 论文期刊网 Corporation All Rights Reserved.
《中华人民共和国信息产业部》备案号:ICP备07016076号;《公安部》备案号:33010402003207
本网站专业、正规提供职称论文发表和写作指导服务,并收录了海量免费论文和数百个经国家新闻出版总署审批过的具有国内统一CN刊号与国际标准ISSN刊号的合作期刊,供诸位正确选择和阅读参考,免费论文版权归原作者所有,谨防侵权。联系邮箱:256081@163.com