默认头像
路人甲
路人甲
  • 注册日期2005-01-14
  • 发帖数114
  • QQ
  • 铜币414枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:2626回复:9

engine中调用icommand的问题?

楼主#
更多 发布于:2005-03-13 19:48

在engine中不使用toolbarcontrol添加工具

在程序中调用icommand的时候出现错误,大家帮忙看一下

Dim pCommand As ICommand Set pCommand = New ControlsMapzoomtolastextentbackcommand pCommand.OnCreate (MapControl1.Object) If pCommand.Enabled = True Then Set MapControl1.CurrentTool = pCommand End If

运行到Set MapControl1.CurrentTool = pCommand时会出现

类型不匹配的错误

调用tool的时候不会发生这个错误

为什么?那位知道指点下

喜欢0 评分0
女口果人尔能看日月白这段言舌,那言兑日月人尔白勺目艮目青有严重白勺散光 
默认头像
路人甲
路人甲
  • 注册日期2004-09-02
  • 发帖数72
  • QQ
  • 铜币387枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2005-03-14 16:52

公用模块:

Option Explicit Public m_pCmdCln As Collection Public Sub BuildCommand(pName As String)

  Dim pCommand As esriSystemUI.ICommand '   Dim pToolCommand As ICommand

  Set pCommand = m_pCmdCln.Item(pName)        pCommand.OnClick          If (TypeOf pCommand Is esriSystemUI.ITool) Then        Set FrmMain.Map1.CurrentTool = pCommand     End If      End Sub

Private Sub AddCommand(pCmd As esriSystemUI.ICommand)

   ' Dim pMap As IMap     'Set pMap = FrmMain.Map1.Map     pCmd.OnCreate FrmMain.Map1     If pCmd Is Nothing Then Exit Sub     m_pCmdCln.Add pCmd, pCmd.Name      End Sub

Public Sub BuildCommandCollection() '文件        AddCommand New ZoomIn     AddCommand New SelectFeature     AddCommand New NearestSelect     AddCommand New MoveSelFeature     AddCommand New DelSelect     AddCommand New RotateSelect     AddCommand New EditVertex           End Sub

窗体初始化:

       Set m_pCmdCln = New Collection         Call BuildCommandCollection

调用:(比如activebar)

            Case "gotobacktoprevious"         BuildCommand "ZoomBack"          Case "gotonextextent"         BuildCommand "ZoomNext"

hook,类模块

Option Explicit

Private m_pMyMapCtrl As esriMapControl.MapControl

' Constant used by the Error handler function - DO NOT REMOVE Const c_ModuleFileName = "clsHook.cls"

Public Property Let hook(ByVal NewHook As Object)

On Error GoTo ErrorHandler

 If TypeOf NewHook Is esriMapControl.MapControl Then ' Map Control     Set m_pMyMapCtrl = NewHook

  Else ' None     Set m_pMyMapCtrl = Nothing   End If   Exit Property ErrorHandler: '  HandleError False, "Let Hook " ; c_ModuleFileName ; " " ; GetErrorLineNumberString(Erl), Err.Number, Err.Source, Err.Description, 1

End Property

Public Property Get hook() As Object

On Error GoTo ErrorHandler

 If Not m_pMyMapCtrl Is Nothing Then ' Map Control     Set hook = m_pMyMapCtrl   Else     Set hook = Nothing   End If      Exit Property ErrorHandler:   HandleError False, "Get Hook " ; c_ModuleFileName ; " " ; GetErrorLineNumberString(Erl), Err.Number, Err.Source, Err.Description, 1

End Property

Public Property Get FocusMap() As IMap

On Error GoTo ErrorHandler

  If Not m_pMyMapCtrl Is Nothing Then 'Map Control     Set FocusMap = m_pMyMapCtrl.Map        Else     Set FocusMap = Nothing ' None   End If      Exit Property ErrorHandler: '  HandleError False, "Get FocusMap " ; c_ModuleFileName ; " " ; GetErrorLineNumberString(Erl), Err.Number, Err.Source, Err.Description, 1

End Property

Public Property Get ActiveView() As IActiveView    On Error GoTo ErrorHandler        If Not m_pMyMapCtrl Is Nothing Then 'Map Control     Set ActiveView = m_pMyMapCtrl.Map   Else     Set ActiveView = Nothing ' None   End If      Exit Property ErrorHandler:   HandleError False, "Get ActiveView " ; c_ModuleFileName ; " " ; GetErrorLineNumberString(Erl), Err.Number, Err.Source, Err.Description, 1

End Property

Public Property Get hwnd() As Long

On Error GoTo ErrorHandler

 If Not m_pMyMapCtrl Is Nothing Then 'MapControl     hwnd = m_pMyMapCtrl.hwnd   Else     hwnd = 0 ' None   End If      Exit Property ErrorHandler: '  HandleError False, "Get hWnd " ; c_ModuleFileName ; " " ; GetErrorLineNumberString(Erl), Err.Number, Err.Source, Err.Description, 1

End Property

我都是这样做的,注意activebar初始化,否则用这种方法实例化的按钮,和其他的按钮会有冲突

[此贴子已经被作者于2005-3-15 8:54:35编辑过]
http://www.geostar.com.cn(吉奥 公司) http://www.waterblue.com.cn(水之灵,蓝之静 个人)
举报 回复(0) 喜欢(0)     评分
默认头像
路人甲
路人甲
  • 注册日期2003-08-19
  • 发帖数88
  • QQ
  • 铜币230枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2005-03-14 17:49

ControlsMapzoomtolastextentbackcommand只实现

了ICommand接口,当然Set MapControl1.CurrentTool = pCommand会出错,该为

Dim pCommand As ICommand Set pCommand = New ControlsMapzoomtolastextentbackcommand pCommand.OnCreate (MapControl1.Object)

pCommand.OnClick() If typeof pCommand is ITool Then Set MapControl1.CurrentTool = pCommand End If

 

举报 回复(0) 喜欢(0)     评分
默认头像
路人甲
路人甲
  • 注册日期2005-01-14
  • 发帖数114
  • QQ
  • 铜币414枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2005-03-14 20:13

谢谢二位的指点,2楼的代码很长 ,我还没有看完。

不过我感觉为了避免冲突没有必要这么麻烦的,

你可以在调用一个按钮之前

set mapcontrol1.currenttool=nothing

完全可以避免冲突

可能还不太理解你用这些代码的思想,回头再细看以下。

女口果人尔能看日月白这段言舌,那言兑日月人尔白勺目艮目青有严重白勺散光 
举报 回复(0) 喜欢(0)     评分
默认头像
路人甲
路人甲
  • 注册日期2004-09-02
  • 发帖数72
  • QQ
  • 铜币387枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2005-03-15 08:53

这是一种工程项目中常见的方式,用类模块实现。添加一个新的按钮,BUild一下,代码编写在类模块中实现就OK了

避免冲突的意思其中需要注意的而已。

http://www.geostar.com.cn(吉奥 公司) http://www.waterblue.com.cn(水之灵,蓝之静 个人)
举报 回复(0) 喜欢(0)     评分
默认头像
路人甲
路人甲
  • 注册日期2004-07-26
  • 发帖数34
  • QQ
  • 铜币65枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于:2005-03-15 12:53

要给MapControl的CurrentTool属性赋值,必须shixianITool接口的类才行

举报 回复(0) 喜欢(0)     评分
默认头像
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
6楼#
发布于:2005-03-15 17:58
2楼好人!
GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
默认头像
路人甲
路人甲
  • 注册日期2003-08-06
  • 发帖数16
  • QQ
  • 铜币182枚
  • 威望0点
  • 贡献值0点
  • 银元0个
7楼#
发布于:2005-03-21 08:38

好贴,顶!

举报 回复(0) 喜欢(0)     评分
默认头像
伴读书童
伴读书童
  • 注册日期2004-09-16
  • 发帖数120
  • QQ
  • 铜币638枚
  • 威望0点
  • 贡献值0点
  • 银元0个
8楼#
发布于:2005-03-25 08:24
我也许很笨,但是我一直再努力,没有放弃!
举报 回复(0) 喜欢(0)     评分
默认头像
路人甲
路人甲
  • 注册日期2007-03-14
  • 发帖数12
  • QQ
  • 铜币179枚
  • 威望0点
  • 贡献值0点
  • 银元0个
9楼#
发布于:2007-10-04 10:11
以下是引用xxwwdd在2005-3-14 17:49:57的发言:

ControlsMapzoomtolastextentbackcommand只实现

了ICommand接口,当然Set MapControl1.CurrentTool = pCommand会出错,该为

Dim pCommand As ICommand
Set pCommand = New ControlsMapzoomtolastextentbackcommand
pCommand.OnCreate (MapControl1.Object)

pCommand.OnClick()
If typeof pCommand is ITool Then
Set MapControl1.CurrentTool = pCommand
End If



不错,不错,谢谢xxwwdd了
举报 回复(0) 喜欢(0)     评分
默认头像

返回顶部