PowerBuilder和MapInfo的集成开发技术
一个窗口
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")
图2 回调技术的实现
首先,在包含集成地图窗口的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对象获取回调信息
ls_MI_CommandInfo = MBAppOleObject.MBGlobals.Item("g_CommandInfoString").Value
5.充分利用MapBasic应用程序
MapBasic是MapInfo提供的用户系统开发工具,它具有对地图对象的管理、对含有地图对象的MapInfo表的管理等方面的强大功能。
在将MapInfo地图集成到PowerBuilder的开发应用中,MapBasic不仅仅能用来实现回调,还可实现其它诸多功能。例如,在开发过程中经常会遇到需要保存地图对象类型的中间结果的问题,而在PowerBuilder中没有与之对应的数据类型,又难以通过MapInfo OLE自动 《PowerBuilder和MapInfo的集成开发技术(第2页)》
本文链接地址:http://www.oyaya.net/fanwen/view/175492.html
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")
图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对象获取回调信息
ls_MI_CommandInfo = MBAppOleObject.MBGlobals.Item("g_CommandInfoString").Value
5.充分利用MapBasic应用程序
MapBasic是MapInfo提供的用户系统开发工具,它具有对地图对象的管理、对含有地图对象的MapInfo表的管理等方面的强大功能。
在将MapInfo地图集成到PowerBuilder的开发应用中,MapBasic不仅仅能用来实现回调,还可实现其它诸多功能。例如,在开发过程中经常会遇到需要保存地图对象类型的中间结果的问题,而在PowerBuilder中没有与之对应的数据类型,又难以通过MapInfo OLE自动 《PowerBuilder和MapInfo的集成开发技术(第2页)》