首页 > 文秘写作 > 写作指导 / 正文
【PowerBuilder和MapInfo的集成开发技术】集成技术
2019-12-01 07:38:51 ℃PowerBuilder是一个面向对象的用于构造基于客户/服务器(Client/Server)数据库应用系统的开发工具,它通过ODBC可同时支持Sysbase、Oracle、Informix、SQLServer等多种关系数据库,具有强大的数据库应用程序开发功能,尤其是它提供的如数据窗口(DataWindow)等工具,使其能够更加方便有效地访问与操纵数据库。
MapInfo是由美国MapInfo公司推出的地理信息系统开发平台,其核心包括MapInfoProfessional和MapBasic两个部件。通过MapInfo平台,能把大量信息直观地与地理图形有机联系起来,使枯燥的表格数据可视化,从而极大地方便了数据分析和辅助决策。
利用PowerBuilder强大的数据访问与操纵能力和MapInfo的地图信息管理功能,结合IntegratedMapping技术、OLE自动化技术等,将MapInfo地图集成到PowerBuilder的应用中,可以迅速地开发出具有强大地图处理能力的应用程序,使数据库中繁杂抽象的数据快速、准确、灵活地显示于电子地图之上,将数据可视化,实现空间数据和属性数据的有机结合。
1开发框架
使用PowerBuilder和MapInfo集成开发技术所开发的应用程序,称为集成的地图应用程序(IntegratedMappingApplication)。在集成的地图应用程序中,以客户/服务器的开发模式,使用PowerBuilder开发的应用程序称为客户程序。客户程序运行在前台,通过OLE调用在后台运行的作为OLE自动化服务器的Mapinfo。
在集成的地图应用程序中,根据MapInfo提供的IntegratedMapping接口,在PowerBuilder客户程序中使用OutboundOLEAutomation(输出OLE自动化)技术,将MapInfo的地图窗口集成到客户程序中,从而使客户程序具备地图处理能力。客户程序使用MapInfoOLE自动化对象、MapBasicOLE自动化对象的有关属性和方法,通过MapInfoOLE自动化服务器对集成的地图窗口进行控制。图1给出了客户程序和服务器程序间的关系。
2.建立PowerBuilder客户程序和MapInfoOLE服务器的连接
建立PowerBuilder客户程序和MapInfoOLE服务器的连接在原理上是:在PowerBuilder开发的客户程序中,通过使用OutboundOLEAutomation技术实现客户程序和MapInfo服务器的连接,借助OLE调用MapInfo服务器。具体实现上是:在包含地图窗口的框架窗口的Open事件中添加代码,创建一个新的OLEObject,而将MapInfo作为这个新的OLEObject的OLE服务器。要调用MapInfo服务,则需调用ConnectToNewObject()函数并传递OLEProgrammableObject的程序标识,即MapInfo.Application:
//OLEObject对象的实例
OLEObjectMapInfo
//接收错误代码
IntegerErrCode
//创建一个与MapInfo进行通信的OLE自动化对象
MapInfo=CreateOLEObject
//连接OLE自动化对象到MapInfo服务器
ErrCode=MapInfo.ConnectToNewObject("MapInfo.Application")
IfErrCode<0Then
MessageBox("FatalError","Errorconnectingtothemapserver.Exiting...")
Ruturn
EndIf
在退出应用程序时,要调用DisConnectToObject()函数断开OLE自动化对象和MapInfoOLE自动化服务器之间的连接,并撤消OLE自动化对象,以释放其占用的系统资源。为此,可在上述框架窗口的Close事件中添加代码实现:
//断开与OLE自动化对象与MapInfo服务器的连接
MapInfo.DisConnectToObject()
//释放OLE自动化对象
DestroyMapInfo
3.将地图窗口集成到PowerBuilder应用程序中
要将MapInfo的地图窗口集成到PowerBuilder开发的客户程序中,必须在客户程序中为MapInfo中的应用窗口重新指定父窗口,并指定一个Picture控件作为集成的地图窗口的父窗口。可以使用OLE自动化对象的Do方法实现上述功能:
//重新指定MapInfo中的应用窗口的父窗口为应用程序窗口
//其中w_map为一个窗口
MapInfo.Application.Do("SetApplicationWindow"+String(Handle(w_map)))
//指定一个Picture控件棗p_map为地图窗口的父窗口,将地图窗口集成到客户程序中
MapInfo.Do("SetNextDocumentParent"+string(Handle(p_map))+"Style1").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中定义的一个全局变量中,然后使用Win32API函数PostMessage(),以PowerBuilder应用窗口的句柄和该窗口的用户自定义事件的ID为参数,向PowerBuilder客户程序发送消息,这样PowerBuilder客户程序就可以在该窗口的用户自定义事件中处理地图窗口事件了,并且还可以使用MBApplications对象的方法,获取MapBasic全局变量中保存的事件信息。如下代码展示了MapBasic应用程序在接收到地图对象选择事件时的处理的过程:
#39;预定义PowerBuilder应用窗口的用户自定义事件的唯一数值标识符
DEFINESELECTION_MADE1024
#39;响应地图对象选择事件
SubSelChangedHandler()
#39;如果选中一个地图对象
IfCommandInfo(CMD_INFO_SELTYPE)=1Then
#39;保存地图对象所在的表的名称
g_seltabname=SelectionInfo(SEL_INFO_TABLENAME)
#39;向PowerBuilder客户程序发送消息
iRc=PostMessage(g_pbhwnd_bg,SELECTION_MADE,0,0)
EndIf
EndSub
下面的程序段中给出了实现回调时PowerBuilder客户程序的处理过程。该处理过程使用了MapBasic编写的mbserver.mbx程序。在MapBasic程序中保存事件信息的变量为g_SelTabName,而g_PbHWnd是MapBasic程序中用来接收PowerBuilder客户程序窗口句柄的全局变量。
//在MapInfo服务器中运行MapBasic应用程序
MapInfo.Do("RunApplication~""+gs_AppDir+"DataFusion.mbx~"")
//创建对MapBasic应用程序进行控制的OLE自动化对象
MBAppOleObject=CreateOleObject
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对象获取回调信息
ls_MI_CommandInfo=MBAppOleObject.MBGlobals.Item("g_CommandInfoString").Value
5.充分利用MapBasic应用程序
MapBasic是MapInfo提供的用户系统开发工具,它具有对地图对象的管理、对含有地图对象的MapInfo表的管理等方面的强大功能。
在将MapInfo地图集成到PowerBuilder的开发应用中,MapBasic不仅仅能用来实现回调,还可实现其它诸多功能。例如,在开发过程中经常会遇到需要保存地图对象类型的中间结果的问题,而在PowerBuilder中没有与之对应的数据类型,又难以通过MapInfoOLE自动化对象的方法和属性实现等诸如此类的问题,若利用MapBasic应用程序以及使用它的OLE自动化对象MBApplications的方法和属性来解决,可以达到事半功倍之效果。
与MapInfoOLE自动化对象相似,MapBasic的OLE自动化对象MBApplications也有自己的Do方法和Eval方法。每当PowerBuilder客户程序调用它们时,MapInfo就会自动调用MapBasic的保留过程RemoteMsgHandler()或RemoteQueryHandler()过程,并可以在过程中通过CommandInfo(CMD_INFO_MSG)得到调用Do方法或Eval方法的参数。
以下代码运用MBApplications的Do方法,实现改变当前选中地图对象的颜色:
//要求将当前选中地图对象的颜色改为兰色
MBAppOleObject.Do("Blue")
MapInfo将自动调用RemoteMsgHandler()过程:
SubRemoteMsgHandler()
DimMyObjectAsObject
#39;获取并分析Do方法的参数
CmdInfoStr=CommandInfo(CMD_INFO_MSG)
#39;改变地图对象的颜色
IfCmdStr="Blue"then
MyObject=Selection.obj
AlterObjectMyObjectInfo2,MakeCustomSymbol("Towe1-32.bmp",RGB(0,0,255),18,2)
UpdateSelectionsetobj=MyObjectWhereRowID=1
EndIf
EndSub
MBApplications的Eval方法的调用与Do方法的类似,只不过MapInfo将自动调用RemoteQueryHandler()过程,并要求返回一个结果。
6结束语
目前,关于MapInfo地图的集成应用大都是利用VB、VC++开发的,利用PowerBuilder开发的实际应用却很少,以至很多人认为难以利用PowerBuilder实现对MapInfo的集成开发,就算实现了也难以很好地完成对地图窗口的控制。本文介绍了如何将MapInfo地图集成到PowerBuilder的开发应用中的基本方法,以及其中的一些关键技术。运用此方法开发应用程序,可以充分发挥PowerBuilder强大的数据访问与操纵能力和MapInfo的地图信息管理功能,迅速地、灵活地开发基于地理信息系统的客户/服务器的信息管理系统。
猜你喜欢
- 2021-10-06 2022纪念抗战胜利75周年弘扬抗战精神优秀作文参考五篇
- 2021-10-05 新推只争朝夕不负韶华作文材料五篇2021
- 2021-10-02 校长工作述职报告新推8篇
- 2021-10-02 推进农产品仓储保鲜冷链设施建设实施方案新推
- 2021-10-02 实施人才强国战略神党课讲稿精选【五篇】
- 2021-05-06 2021年学习延安精神心得感悟文本
- 2021-05-06 有关2021年个人廉洁自查报告2021五篇
- 2021-05-06 5篇2021年政法队伍教育整顿查纠整改生活会个人对照检查剖析
- 2021-05-06 人民生活幸福是‘国之大者’精神心得体会
- 2021-05-05 公安局政法队伍教育整顿专题民主生活会班子对照检查发言总结范文
- 搜索
-
- 组织生活会会前学习研讨材料 11-06
- 中美贸易战心得体会5篇 06-14
- 加强基层公安派出所党建工作的思考与建 05-24
- XX村消防安全知识宣传简报 11-14
- 2021国家开放大学电大本科《液压气动技 11-05
- 部队党小组会个人发言 08-04
- 2020年党小组会议记录 06-18
- 八国联军狂欢夜的由来 平安夜的由来 01-19
- 思政课教学设计 08-26
- 六顶思考帽在日常工作中的实际应用案例 04-09
- 11-25国庆70周年庆典晚会 庆典晚会串词
- 11-25办公室礼仪的十大原则 浅谈办公室的电话礼仪
- 01-17用心灵轻轻地歌唱_心灵的歌唱
- 01-17也许你不是我一生的唯一|也许不是我
- 01-17爱了,请珍惜;不爱,趁早放手|爱就珍惜不爱就放手
- 01-17岁月带走的是记忆,但回忆会越来越清晰|有趣又有深意的句子
- 01-17曾经的美好只是曾经,我只想珍惜身边的人|我只想珍惜你
- 01-18从容不惊 [学会笑眼去看世界,不惊不乍,淡定从容]
- 02-03当代大学生学习态度调查报告
- 02-03常用护患英语会话
- 标签列表