阅读:2626回复:9
engine中调用icommand的问题?在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的时候不会发生这个错误 为什么?那位知道指点下 |
|
|
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编辑过] |
|
|
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
|
|
3楼#
发布于:2005-03-14 20:13
谢谢二位的指点,2楼的代码很长 ,我还没有看完。 不过我感觉为了避免冲突没有必要这么麻烦的, 你可以在调用一个按钮之前 set mapcontrol1.currenttool=nothing 完全可以避免冲突 可能还不太理解你用这些代码的思想,回头再细看以下。 |
|
|
4楼#
发布于:2005-03-15 08:53
这是一种工程项目中常见的方式,用类模块实现。添加一个新的按钮,BUild一下,代码编写在类模块中实现就OK了 避免冲突的意思其中需要注意的而已。 |
|
|
5楼#
发布于:2005-03-15 12:53
要给MapControl的CurrentTool属性赋值,必须shixianITool接口的类才行 |
|
6楼#
发布于:2005-03-15 17:58
2楼好人! ![]() |
|
|
7楼#
发布于:2005-03-21 08:38
好贴,顶! |
|
8楼#
发布于:2005-03-25 08:24
![]() |
|
|
9楼#
发布于:2007-10-04 10:11
以下是引用xxwwdd在2005-3-14 17:49:57的发言:
ControlsMapzoomtolastextentbackcommand只实现 了ICommand接口,当然Set MapControl1.CurrentTool = pCommand会出错,该为 Dim pCommand As ICommand pCommand.OnClick() 不错,不错,谢谢xxwwdd了 |
|